20

我在 Java 中有一个 ArrayList,我需要在其中找到所有出现的特定对象。方法 ArrayList.indexOf(Object) 只找到一次,所以我似乎需要别的东西。

4

6 回答 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

这类似于这个答案,只是使用streamAPI 代替。

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进行比较的每个元素objectarrayList.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+

如果要预先计算 中每个值的索引ListCollectors.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

然后,要查找特定值的所有索引,请使用getonMap常数时间。

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

Demo

于 2021-03-13T23:51:59.507 回答