我有一个Java中的ArrayList,需要查找其中特定对象的所有出现次数。ArrayList.indexOf(Object)方法只能找到一个出现次数,因此我需要其他方法。
我认为在这方面你不需要太过花哨。以下内容应该能够正常起作用:
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;
}
我想您需要获取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
方法搜索对象,并将当前数组索引保存到具有索引的列表中。在您的问题中,您正在引用indexOf
,该方法使用equals
方法测试相等性,正如Java文档中所述:
使用
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();
}
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]
遍历所有元素,不要中断循环。
将ArrayList
的每个元素与您的object
进行比较(arrayList.get(i).equals(yourObject)
)。
如果匹配,则应将索引(i)存储在单独的ArrayList
中(arraListMatchingIndexes
)。
有时我会这样做“删除所有”,当我需要位置时。
希望这可以帮助您!
Do
for (int i=0; i<arrList.size(); i++){
if (arrList.get(i).equals(obj)){
// It's an occurance, add to another list
}
}
==
,如果相等的对象意味着“包含相同的数据”,那么就是 .equals()
版本。 - Jiří如果您想要预计算List
中每个值的索引,可以在索引的IntStream
上使用Collectors.groupingBy
。
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
List<Integer> indexes = indexMap.get(value);
equals
还是==
? - Peter Lawrey==
操作符仅比较reference
的值,而不是对象的实际内容。因此,如果您使用==
比较具有相同值的两个不同对象的引用,则将得到 false 结果,并且使用equals
方法将得到 true 结果。您可以在互联网上获取关于此主题的大量资源。只需谷歌搜索 - “equals v/s =="。 - Rohit Jain==
判断,那么它们是同一个特定对象,而不仅仅是包含相同值的两个对象。这意味着,虽然new Integer(1234).equals(new Integer(1234))
成立,但是new Integer(1234) != new Integer(1234)
因为它们不是同一个对象。 - Peter Lawrey