Trying to find all occurrences of an object in Arraylist, in java

Posted on

Trying to find all occurrences of an object in Arraylist, in javaError is an illegal operation performed by the user which results in the abnormal working of the program. By now, you’ve probably seen a few errors, either when compiling or running your code like Trying to find all occurrences of an object in Arraylist, in java. It can be frustrating, but they can also give you a lot of information about exactly how you can fix the problems in your code about java and arraylist. In this post covers the types of errors you’ll see when programming in Java, and how to fix them. Don’t pay any attention to the number of errors. Just read the first error message and work on fixing that error.

Problem :

I have an ArrayList in Java, and I need to find all occurrences of a specific object in it.
The method ArrayList.indexOf(Object) just finds one occurrence, so it seems that I need something else.

Solution :

I don’t think you need to be too fancy about it. The following should work fine:

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

I suppose you need to get all indices of the ArrayList where the object on that slot is the same as the given object.

The following method might do what you want it to do:

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

It searches for the object using the equals method, and saves the current array index to the list with indices. You’re referring to indexOf in your question, which uses the equals method to test for equality, as said in the Java documentation:

Searches for the first occurence of the given argument, testing for equality using the equals method.


Update

Using Java 8 streams it’ll become much easier:

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

This is similar to this answer, just uses stream API instead.

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]

iterate over all elements, don’t break the loop

each element of the ArrayList compare with your object ( arrayList.get(i).equals(yourObject) )

if match than the index ( i ) should be stored into a separate ArrayList ( arraListMatchingIndexes).

Sometimes in this way I do a “remove all”, when I need the positions too.

I hope it helps!

Do

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

Hope this helps.

Java 8+

If you want to precompute the indexes of every value in the List, Collectors.groupingBy can be used on an IntStream of indexes.

import java.util.stream.Collectors;
import java.util.stream.IntStream;
//...
List<Integer> list = Arrays.asList(1, 2, 2, 1, 4, 5, 4, 3, 4, 5, 0);
final Map<Integer, List<Integer>> indexMap = IntStream.range(0, list.size()).boxed()
        .collect(Collectors.groupingBy(list::get));
//Map of item value to List of indexes at which it occurs in the original List

Then, to find all the indexes of a specific value, use get on the Map in constant time.

List<Integer> indexes = indexMap.get(value);

Demo

Leave a Reply

Your email address will not be published. Required fields are marked *