web-dev-qa-db-fra.com

Essayer de trouver toutes les occurrences d’un objet dans Arraylist, en java

J'ai une ArrayList en Java et je dois y trouver toutes les occurrences d'un objet spécifique. La méthode ArrayList.indexOf (Object) ne trouve qu'une occurrence, il semble donc que j'ai besoin d'autre chose.

13
missrg

Je ne pense pas que vous ayez besoin d'être trop sophistiqué à ce sujet. Ce qui suit devrait bien fonctionner:

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
André C. Andersen

Je suppose que vous devez obtenir tous les index de ArrayList où l’objet de cet emplacement est identique à l’objet donné.

La méthode suivante peut faire ce que vous voulez:

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

Il recherche l'objet à l'aide de la méthode equals et enregistre l'index de tableau actuel dans la liste des index. Vous faites référence à indexOf dans votre question, qui utilise la méthode equals pour tester l'égalité, comme indiqué dans la documentation Java:

Recherche la première occurrence de l'argument donné, teste l'égalité à l'aide de la méthode equals.

4
MC Emperor

Ceci est similaire à ceci answer , utilise simplement stream API.

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

itérer sur tous les éléments, ne pas casser la boucle

chaque élément de la ArrayList se compare avec votre object (arrayList.get(i).equals(yourObject))

s'il correspond, l'index (i) doit être stocké dans une ArrayList distincte (arraListMatchingIndexes).

Parfois, de cette manière, je fais un "tout retirer", quand j’ai aussi besoin des positions. 

J'espère que ça aide!

2
user529543

Faire

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

J'espère que cela t'aides.

2