疑問: Javaのchar配列から文字を検索してインデックスを返す

一般的なイディオムが分からず、悩んでいます。

いくつか方法を挙げます。

方法1: (ソートしても問題なければ)binarySearchを使う

char[] chars = new char[]{'a', 'b', 'c', 'd', 'e'};
char target = 'c';

Arrays.sort(chars);
int index = Arrays.binarySearch(chars, target);

当然、ソート前の配列でのインデックスを得たい場合には、この方法は使えません。

方法2: 配列をリスト化する

まず、char配列をCharacterのListに変換します。

String[] strs = new String[] { "a", "b", "c", "d", "e" };
List<String> list = new ArrayList<String>(Arrays.asList(strs));

charで上のコードと同じようなことをしようとしても、下のコードはコンパイルできません。ガーン

char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };
List<Character> cList = new ArrayList<Character>(Arrays.asList(chars));

Arrays.asList(chars)を評価すると、char配列の要素を持つList(List>)になるためです。

しかし、作りたいのはListであり、List>ではありません。

やっぱりこうでしょうか?

char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };
char target = 'c';

List<Character> cList = new ArrayList<Character>();  
for(char each : chars){  
    cList.add(each);  
}

これで、indexOfメソッドを使って、検索文字のインデックスを得られます。

int index = cList.indexOf(target);

(追記)

さくらばさんからコメント頂きました。ありがとうございます。

たしかにそうですね。

Character[] chars = new Character[] { 'a', 'b', 'c', 'd', 'e' };
char target = 'c';

List<Character> cList = Arrays.asList(chars);
int index = cList.indexOf(Character.toUpperCase(target));

charをCharacterにしたことで、asListが使えるようになりました。

方法3: 配列を繰り返し構文で回す

昨日のどう書くの解答では、この方法を使いました。(そこでこの疑問が生まれました)

繰り返し構文の途中で脱出なんかしているあたり、最も原始的な感じです。

char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };
char target = 'c';

for (int i = 0; i < chars.length; i++) {
	if (chars[i] == target) {
		return i;
	}
}

(追記)方法4: Stringに変換する

nidoさんからコメント頂きました。ありがとうございます。

char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };
char target = 'c';

int index = String.valueOf(chars).indexOf(String.valueOf(target));

なるほど! この発想はありませんでした。

(さらに追記)
char配列がCharacter配列になっていたので修正しました。また、変数targetは、Stringに変換しなくても、indexOf(int)にマッチするので大丈夫でした。うらがみさん、ご指摘ありがとうございます。