回答:
Arrays
ユーティリティクラスを使用してこれを実現するには、いくつかの方法があります。
配列がソートされておらず、プリミティブの配列でもない場合:
java.util.Arrays.asList(theArray).indexOf(o)
配列がいる場合で、プリミティブとないソート、1のような他の回答の一つが提供するソリューションを使用する必要がありケレムBaydoğanさん、アンドリュー・マッキンリーのかMishaxのを。上記のコードtheArray
はプリミティブ(おそらく警告を発する)であってもコンパイルされますが、それでも完全に誤った結果が得られます。
配列がソートされている場合は、パフォーマンスのためにバイナリ検索を利用できます。
java.util.Arrays.binarySearch(theArray, o)
T...
の実際の実行時の型はであり、typeのT[]
0個以上のパラメーターを渡すとT
、新しく構築された配列にラップされて渡されます。渡されるパラメーターが既にtype型であるT[]
場合、構文糖衣はバイパスされます。
.indexOf
ただし、ソリューション()はプリミティブには無効です。
Arrays.toList(list).sublist(from,to).indexOf(o)
範囲内の要素を検索するために使用します[from, to)
。
配列にはindexOf()
メソッドがありません。
多分このApache Commons Lang ArrayUtils
メソッドはあなたが探しているものです
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
プリミティブの場合、ボックス化を避けたい場合、Guavaにはプリミティブ配列のヘルパーがあります。たとえば、Ints.indexOf(int [] array、int target)
なにもない。java.util.List
*を使用するか、独自に記述できますindexOf()
。
public static <T> int indexOf(T needle, T[] haystack)
{
for (int i=0; i<haystack.length; i++)
{
if (haystack[i] != null && haystack[i].equals(needle)
|| needle == null && haystack[i] == null) return i;
}
return -1;
}
*あなたはあなたの配列から1つを作ることができます Arrays#asList()
T
は誤解を招くものです。タイプセーフは提供されず、タイプセーフであると間違えやすい...オブジェクトの使用が改善される
indexOf("str", new Object[] {});
、indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
、indexOf(new Date(), new String[] {})
Array.IndexOfメソッドがあるC#やindexOfメソッドがあるJavaScript とは異なり、JavaのAPI(特にArray
およびArrays
クラス)にはそのようなメソッドはありません。
このメソッドindexOfは(そのlastIndexOfと一緒に)java.util.Listインターフェースで定義されます。indexOfとlastIndexOfはオーバーロードされず、パラメーターとしてオブジェクトのみを受け取ることに注意してください。
配列がソートされている場合、Arraysクラスは、可能な限り最高のパフォーマンス(O(n)ではなくO(log n)で探している要素のインデックスを見つけるbinarySearchメソッドの一連のオーバーロードを定義しているので、幸運です。 )、後者はindexOfによって行われる順次検索から期待できるものです。4つの考慮事項があります。
配列は、自然な順序または引数として提供するコンパレータの順序で並べ替える必要があります。または、少なくとも、キーより「小さい」すべての要素が、配列内のその要素の前に来る必要があります。キーが配列のその要素の後に来る必要がある「より大きい」。
キーが配列内にあるかどうかを判別するために通常indexOfで行うテスト(戻り値が-1でないことを確認する)は、binarySearchには当てはまりません。返された値はキーが存在しないことを示しているので、戻り値がゼロ以上であることを確認する必要がありますが、存在した場合に予想されるインデックスです。
キーに等しい複数の要素が配列に含まれている場合、binarySearchから得られるものは未定義です。これは、最初のオカレンスを返すindexOfおよび最後のオカレンスを返すlastIndexOfとは異なります。
ブール値の配列は、最初にすべてのfalse、次にすべてのtrueが含まれている場合、ソートされているように見えますが、これはカウントされません。ブール値の配列を受け入れるbinarySearchメソッドのオーバーライドはありません。たとえば、配列の最初のtrueが配列のどこに現れるかを検出するときにO(log n)パフォーマンスが必要な場合は、そこで賢いことをする必要があります。ブール値と定数Boolean.FALSEおよびBoolean.TRUE。
配列がソートされておらず、プリミティブ型でもない場合、 java.util.ArraysのasListメソッドを呼び出すことにより、ListのindexOfメソッドとlastIndexOfメソッドを使用できます。このメソッドは、配列のAbstractListインターフェイスラッパーを返します。アレイのコピーを作成しないため、オーバーヘッドは最小限です。前述のように、このメソッドはオーバーロードされないため、参照型の配列でのみ機能します。
配列がソートされておらず、配列のタイプがプリミティブである場合は、Java APIを使用できません。独自のforループ、または独自の静的ユーティリティメソッドを記述します。これらは、オブジェクトのインスタンス化のオーバーヘッドを伴うasListアプローチよりもパフォーマンス上の利点があります。配列のすべての要素を反復するブルートフォースループを作成することがエレガントな解決策ではない場合は、indexOfを呼び出すときにJava APIが実行していることをそのまま受け入れてください。あなたはこのようなものを作ることができます:
public static int indexOfIntArray(int[] array, int key) {
int returnvalue = -1;
for (int i = 0; i < array.length; ++i) {
if (key == array[i]) {
returnvalue = i;
break;
}
}
return returnvalue;
}
ここで独自のメソッドを記述したくない場合は、Guavaなどの開発フレームワークからのメソッドの使用を検討してください。そこではindexOfとlastIndexOfの実装を見つけることができます。
自分でコーディングする以外に、配列の「indexOf」を思い出したことはありません...ただし、配列にプリミティブ型が含まれている場合は、多くのjava.util.Arrays#binarySearch(...)
メソッドの1つ(配列javadocを参照)を使用できます。
おそらく、配列ではなくjava.util.ArrayListを考えているでしょう。
ジェフリー・ハンティンの答えは良いですが、これがこれを行うか、そうでなければそれにはいくつかの制約があります...
あなたはあなた自身の拡張メソッドを書くことができ、それはいつもあなたが望む方法で機能します。
Lists.indexOf(array, x -> item == x); // compare in the way you want
そしてここにあなたの拡張があります
public final class Lists {
private Lists() {
}
public static <T> int indexOf(T[] array, Predicate<T> predicate) {
for (int i = 0; i < array.length; i++) {
if (predicate.test(array[i])) return i;
}
return -1;
}
public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
for (int i = 0; i < list.size(); i++) {
if (predicate.test(list.get(i))) return i;
}
return -1;
}
public interface Predicate<T> {
boolean test(T t);
}
}
int findIndex(int myElement, int[] someArray){
int index = 0;
for(int n: someArray){
if(myElement == n) return index;
else index++;
}
}
注:このメソッドはint型の配列に使用できます。このアルゴリズムは、小さな変更を加えた他の型にも使用できます。