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

时间:2012-12-16 10:54:10

标签: java arraylist indexof

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

6 个答案:

答案 0 :(得分:17)

我认为你不需要过于花哨。以下应该可以正常工作:

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

答案 1 :(得分:4)

我想你需要得到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方法测试相等性。

答案 2 :(得分:2)

迭代所有元素,不要破坏循环

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

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

当我需要这些职位的时候,有时这样我会“全部删除”。

我希望它有所帮助!

答案 3 :(得分:2)

待办事项

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

希望这有帮助。

答案 4 :(得分:2)

这与此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]

答案 5 :(得分: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 使用 Map

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

Demo