我在 Java 中有一个 ArrayList,我需要在其中找到所有出现的特定对象。方法 ArrayList.indexOf(Object) 只找到一次,所以我似乎需要别的东西。
问问题
45156 次
6 回答
21
我认为你不需要太花哨。以下应该可以正常工作:
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;
}
于 2012-12-16T11:39:40.010 回答
6
我想您需要获取 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();
}
于 2012-12-16T11:18:29.390 回答
4
这类似于这个答案,只是使用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]
于 2017-03-02T14:13:34.913 回答
2
遍历所有元素,不要打破循环
与您的( )ArrayList
进行比较的每个元素object
arrayList.get(i).equals(yourObject)
如果与索引 (i) 匹配,则应将其存储到单独的 ArrayList (arraListMatchingIndexes) 中。
有时,当我也需要职位时,我会以这种方式“全部删除”。
我希望它有帮助!
于 2012-12-16T10:58:29.320 回答
2
做
for (int i=0; i<arrList.size(); i++){
if (arrList.get(i).equals(obj)){
// It's an occurance, add to another list
}
}
希望这可以帮助。
于 2012-12-16T10:59:46.857 回答
0
Java 8+
如果要预先计算 中每个值的索引List
,Collectors.groupingBy
可以在IntStream
索引中使用。
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
然后,要查找特定值的所有索引,请使用get
onMap
常数时间。
List<Integer> indexes = indexMap.get(value);
于 2021-03-13T23:51:59.507 回答