试图在Java的Arraylist中查找对象的所有出现

问题描述 投票:16回答:5

我在Java中有一个ArrayList,我需要在其中查找所有出现的特定对象。方法ArrayList.indexOf(Object)仅发现一个事件,因此似乎我还需要其他东西。

java arraylist indexof
5个回答
19
投票

我认为您不必对此太幻想。以下应该可以正常工作:

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

5
投票

我想您需要获取ArrayList的所有索引,其中该插槽上的对象与给定对象相同。

以下方法可能会执行您想要的操作:

public static <T> int[] indexOfMultiple(ArrayList<T> list, T object) {
    ArrayList<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();
}

3
投票

这类似于此answer,仅使用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]

2
投票

重复所有元素,不要打破循环

ArrayList的每个元素与您的objectarrayList.get(i).equals(yourObject))比较

如果比索引(i)匹配,则应将其存储到单独的ArrayList(arraListMatchingIndexes)中。

有时,当我也需要职位时,我会执行“全部删除”。

希望对您有帮助!


2
投票

执行

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

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.