web-dev-qa-db-ja.com

java

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

15
missrg

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

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;
}
17

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

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

public static <T> int[] indexOfMultiple(ArrayList<T> list, T object) {
    ArrayList<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メソッドを使用して等しいかどうかをテストし、指定された引数の最初の出現を検索します。

4
MC Emperor

これはこれに似ています answer 、代わりにstream AP​​Iを使用します。

List<String> words = Arrays.asList("lorem","ipsum","lorem","amet","lorem");
String str = "lorem";
List<Integer> allIndexes =
        IntStream.range(0, words.size()).boxed()
                .filter(i -> words.get(i).equals(str))
                .collect(Collectors.toList());
System.out.println(allIndexes); // [0,2,4]
2
Anton Balaniuc

すべての要素を反復処理し、ループを中断しないでください

ArrayListの各要素をobjectと比較します(arrayList.get(i).equals(yourObject)

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

時々このようにして、ポジションも必要なときに「すべて削除」を行います。

お役に立てば幸いです。

2
user529543

行う

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

お役に立てれば。