疑問: 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
やっぱりこうでしょうか?
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に変換する
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)にマッチするので大丈夫でした。うらがみさん、ご指摘ありがとうございます。