Javaで指定されたアレイの要素のインデックスを検索する
この投稿では、Javaのプリミティブアレイまたはオブジェクトアレイで要素のインデックスを見つける方法について説明します。
ソリューションは、必要な要素の最初の出現のインデックスを返すか、アレイに存在しない場合は-1を返す必要があります。
1.素朴な解決策–線形探索
単純な解決策は、指定されたアレイに対して線形検索を実行して、ターゲット要素がアレイに存在するかどうかを判断することです。
⮚プリミティブアレイの場合:
1 2 3 4 5 6 7 8 9 10 11 12 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { for (int i = 0; i < a.length; i++) { if (a[i] == target) { return i; } } return -1; } |
⮚オブジェクトアレイの場合:
1 2 3 4 5 6 7 8 9 10 11 12 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { for (int i = 0; i < a.length; i++) { if (target.equals(a[i])) { return i; } } return -1; } |
2.Java8ストリームの使用
以下に示すように、Java 8 Streamを使用して、プリミティブおよびオブジェクトアレイ内の要素のインデックスを見つけることができます。
⮚プリミティブアレイの場合:
1 2 3 4 5 6 7 8 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { return IntStream.range(0, a.length) .filter(i -> target == a[i]) .findFirst() .orElse(-1); //ターゲットが見つからない場合は-1を返します } |
⮚オブジェクトアレイの場合:
1 2 3 4 5 6 7 8 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { return IntStream.range(0, a.length) .filter(i -> target.equals(a[i])) .findFirst() .orElse(-1); //ターゲットが見つからない場合は-1を返します } |
3.リストに変換
アイデアは、指定されたアレイをリストに変換し、 List.indexOf()
このリストで指定された要素の最初の出現のインデックスを返すメソッド。
⮚プリミティブアレイの場合:
プリミティブ整数アレイを List<Integer> に変換する方法は?
1 2 3 4 5 6 7 8 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { return Arrays.stream(a) // IntStream .boxed() // Stream<Integer> .collect(Collectors.toList()) // List<Integer> .indexOf(target); } |
⮚オブジェクトアレイの場合:
1 2 3 4 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { return Arrays.asList(a).indexOf(target); } |
4.ソートされたアレイのバイナリ検索
ソートされたアレイの場合、次を使用できます バイナリ検索アルゴリズム 指定されたアレイで指定された値を検索します。
⮚プリミティブアレイの場合:
1 2 3 4 5 6 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { int index = Arrays.binarySearch(a, target); return (index < 0) ? -1 : index; } |
⮚オブジェクトアレイの場合:
1 2 3 4 5 6 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { int index = Arrays.binarySearch(a, target); return (index < 0) ? -1 : index; } |
5.Guavaライブラリの使用
⮚プリミティブアレイの場合:
Guavaライブラリは、プリミティブに関連するいくつかのユーティリティクラスを提供します。 Ints intの場合、 Longs
長い間、 Doubles
ダブルの場合、 Floats
フロート用、 Booleans
ブール値など。
各ユーティリティクラスには、 indexOf()
アレイ内のターゲットの最初の出現のインデックスを返すメソッド。使用することもできます lastIndexOf()
アレイ内のターゲットの最後の出現のインデックスを返します。
1 2 3 4 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { return Ints.indexOf(a, target); } |
⮚オブジェクトアレイの場合:
Guava’s com.google.commons.collect.Iterables クラスには静的ユーティリティメソッドが含まれています indexOf(Iterator, Predicate)
これは、指定された述語を満たす最初の要素のインデックスを返します。イテレータにそのような要素がない場合は-1を返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { int index = Iterators.indexOf(Iterators.forArray(a), new Predicate<T>() { public boolean apply(T input) { return input.equals(target); } }); return index; } |
使用することもできます com.google.common.base.Predicates に関連する静的ユーティリティメソッドを含むGuavaによって提供されるクラス Predicate
インスタンス。
1 2 3 4 5 6 7 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { int index = Iterators.indexOf(Iterators.forArray(a), Predicates.in(Collections.singleton(target))); return index; } |
Java 8以降では、ラムダ式を使用できます。
1 2 3 4 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { return Iterators.indexOf(Iterators.forArray(a), x -> x.equals(target)); } |
6. ApacheCommonsLangの使用
Apache Commons Lang ArrayUtils クラスには、プリミティブアレイまたはオブジェクトアレイを操作するいくつかの静的ユーティリティメソッドが含まれています。それは提供します indexOf()
アレイ内の指定された値のインデックスを見つけるメソッド。
⮚プリミティブアレイの場合:
1 2 3 4 |
//Javaのプリミティブアレイ内の要素のインデックスを検索するメソッド public static int find(int[] a, int target) { return ArrayUtils.indexOf(a, target); } |
⮚オブジェクトアレイの場合:
1 2 3 4 |
//Javaでオブジェクトアレイ内の要素のインデックスを検索する一般的なメソッド public static<T> int find(T[] a, T target) { return ArrayUtils.indexOf(a, target); } |
これで、Javaのアレイ内の要素のインデックスを見つけることができます。