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.
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.
==
, if equal object means "contain the same data", then it"s the .equals()
version –
Increasing 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);
© 2022 - 2024 — McMap. All rights reserved.
equals
or==
– Annisequals
to compare object contents. WhetherInteger
, or any other objects. – Gripper==
operator only compares the value ofreference
, and not the actual content of the objects. Thus you compare references to two different object with same value, you would get false result with==
and true result withequals
method. You can get immense resource on this topic on internet. just google - "equals v/s ==" – Gripper==
then they are the same specific object, not just two objects which happen to contain the same values. This means that whilenew Integer(1234).equals(new Integer(1234))
it is the case thatnew Integer(1234) != new Integer(1234)
as they are not the same object. – Annis