web-dev-qa-db-ja.com

JavaのArray indexOfはどこにありますか?

私は非常に明白な何かを見逃しているに違いありません、しかし、私は至る所で調べました、そして、この方法を見つけることができません。

174
Jamie

Arrays ユーティリティクラスを使用してこれを実現する方法がいくつかあります。

配列がソートされておらず、でない場合は、次のようになります。

Java.util.Arrays.asList(theArray).indexOf(o)

配列プリミティブでソートされていない場合は、 KeremBaydoğan'sAndrew)のような他の答えの1つによって提供される解を使用する必要があります。 McKinlay's or Mishax'stheArrayが原始的(おそらく警告を発する)であっても上記のコードはコンパイルされますが、それでもやはり全く間違った結果を得るでしょう。

配列がソートされている場合は、パフォーマンスのためにバイナリ検索を利用できます。

Java.util.Arrays.binarySearch(theArray, o)
213
Jeffrey Hantin

配列にindexOf()メソッドはありません。

多分このApache Commons Lang ArrayUtils メソッドがあなたが探しているものです。

import org.Apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
56
Kerem Baydoğan

なにもない。 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;
}

* Arrays#asList() を使ってあなたの配列から作ることができます。

18
Matt Ball

プリミティブの場合、ボクシングを避けたい場合は Guava にプリミティブ配列のヘルパーがあります。 Ints.indexOf (int [] array、int target)

16
Andrew McKinlay

Array.IndexOf メソッドを持つC#、および indexOf メソッドを持つJavaScriptとは異なり、JavaのAPI(ArrayおよびArraysクラスは特に)そのような方法はありません。

このメソッドindexOf(とその補完lastIndexOf)は、 Java.util.List インタフェースで定義されています。 indexOfとlastIndexOfはオーバーロードされず、パラメータとしてObjectを受け取るだけです。

配列がソートされている場合は、配列クラスがbinarySearchメソッドの一連のオーバーロードを定義しているため、幸運です。可能な限り最高のパフォーマンスで検索します(O(n)ではなくO(log n)、後者はindexOfによる逐次検索から期待できるものです)。考慮事項が4つあります。

  1. 配列は、自然な順序で、または引数として指定したComparatorの順序でソートする必要があります。または、少なくともキーより「小さい」すべての要素は、配列内のその要素の前に配置する必要があります。 「より大きい」キーは配列内のその要素の後にくる必要があります。

  2. キーが配列内にあるかどうかを判断するために通常はindexOfを使用して行うテスト(戻り値が-1ではないかどうかの検証)は、binarySearchには当てはまりません。返された値はキーが存在しないことを示しますが、存在した場合に期待されるインデックスを示すため、戻り値がゼロ以上であることを確認する必要があります。

  3. 配列にキーと等しい要素が複数含まれる場合、binarySearchから得られるものは未定義です。これは最初の出現を返すindexOfおよび最後の出現を返すlastIndexOfとは異なります。

  4. ブール値の配列は、最初にすべての偽名を含み、次にすべての真理値を含む場合はソートされているように見えますが、これは当てはまりません。ブール値の配列を受け入れるbinarySearchメソッドをオーバーライドすることはなく、配列の最初のtrueが現れる場所を検出するときにO(log n)のパフォーマンスが必要な場合は、そこで何か賢い方法をとる必要があります。ブール値と定数Boolean.FALSEおよびBoolean.TRUE。

配列がソートされておらず、プリミティブ型ではない場合は、 asList を呼び出すことで、ListのindexOfメソッドとlastIndexOfメソッドを使用できます。 )Java.util.Arraysのメソッドこのメソッドは、配列を囲む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のような開発フレームワークのものを使うことを検討してください。そこでは、 indexOflastIndexOf の実装を見つけることができます。

12
Mishax

JavaのArrayListにはindexOfメソッドがあります。 Java配列にはそのようなメソッドはありません。

10
James

配列にプリミティブが含まれている場合は、多くのJava.util.Arrays#binarySearch(...)メソッドの1つを使用できます( Arrays javadoc を参照)。タイプ

6
Kellindil

ListインタフェースにはindexOf()メソッドがあり、ArrayのasList()メソッドを使って配列からListを取得できます。それ以外に、Array自体はそのようなメソッドを持っていません。ソートされた配列のためにbinarySearch()メソッドがあります。

5
Mike Yockey

配列自体はそのメソッドを持っていません。リストは、しかし、行います: indexOf

4
Igor

おそらく、配列ではなく Java.util.ArrayList を考えているのでしょう。

3
duffymo

Java配列には直接のindexOf関数はありません。

2
gambo

Jeffrey Hantin の答えはいいのですが、これがこれをしているのであれば、それ以外には制約があります...

あなたはあなた自身の拡張方法を書くことができます、そしてそれはあなたが望む方法でいつも働きます。

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);
    }
}
0
M.kazem Akhgary