20

Java に ArrayList があり、特定のオブジェクトのすべての出現箇所を見つける必要があります。メソッド ArrayList.indexOf(Object) は 1 つのオカレンスを見つけるだけなので、別の何かが必要なようです。

4

6 に答える 6

21

私はあなたがそれについてあまり空想する必要はないと思います。以下は正常に機能するはずです。

static <T> List<Integer> indexOfAll(T obj, List<T> list) {
    final List<Integer> indexList = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        if (obj.equals(list.get(i))) {
            indexList.add(i);
        }
    }
    return indexList;
}
于 2012-12-16T11:39:40.010 に答える
6

そのスロットのオブジェクトが指定されたオブジェクトと同じである ArrayList のすべてのインデックスを取得する必要があると思います。

次のメソッドは、あなたがやりたいことをするかもしれません:

public static <T> int[] indexOfMultiple(List<T> list, T object) {
    List<Integer> indices = new ArrayList<>();
    for (int i = 0; i < list.size(); i++) {
        if (list.get(i).equals(object)) {
            indices.add(i);
        }
    }
    // ArrayList<Integer> to int[] conversion
    int[] result = new int[indices.size()];
    for (int i = 0; i < indices.size(); i++) {
        result[i] = indices.get(i);
    }
    return result;
}

メソッドを使用してオブジェクトを検索しequals、現在の配列インデックスをインデックス付きリストに保存します。Javaのドキュメントで述べられているように、メソッドを使用して同等性をテストindexOfする質問で言及しています。equals

メソッドを使用して等しいかどうかをテストし、指定された引数の最初の出現を検索しequalsます。


アップデート

Java 8 ストリームを使用すると、はるかに簡単になります。

public static <T> int[] indexOfMultiple(List<T> list, T object) {
    return IntStream.range(0, list.size())
        .filter(i -> Objects.equals(object, list.get(i)))
        .toArray();
}
于 2012-12-16T11:18:29.390 に答える
2

すべての要素を繰り返し、ループを壊さないでください

あなたの()ArrayListと比較の各要素objectarrayList.get(i).equals(yourObject)

インデックス ( i ) よりも一致する場合は、別の ArrayList (arraListMatchingIndexes) に格納する必要があります。

ポジションも必要な場合は、この方法で「すべて削除」することがあります。

それが役立つことを願っています!

于 2012-12-16T10:58:29.320 に答える
2

行う

for (int i=0; i<arrList.size(); i++){
    if (arrList.get(i).equals(obj)){
        // It's an occurance, add to another list
    }
}

お役に立てれば。

于 2012-12-16T10:59:46.857 に答える