Java重复捕获器循环仍然返回dupes

时间:2018-11-14 18:45:17

标签: java list for-loop duplicates

我有一个方法旨在从ArrayList中删除重复的对象。这些对象是自定义类的IndividualEntry,方法如下:

 private static ArrayList<IndividualEntry> cleanList(ArrayList<IndividualEntry> inputList){
        ArrayList<IndividualEntry> thisList = inputList;
        IndividualEntry thisEntry;
        IndividualEntry thatEntry;
        for(int i = 0; i<thisList.size();i++){
            thisEntry = thisList.get(i);
            System.out.println("First entry is "+thisEntry);
        for(int j = (i+1); j<thisList.size(); j++){
            thatEntry = thisList.get(j);
            System.out.println("Second entry is "+thatEntry);
            if(thisEntry.equals(thatEntry)){
                thisList.remove(thatEntry);
            System.out.println("Entry removed: "+thatEntry);
            }
        }
            }
        return thisList;
    }

该方法已成功删除某些重复项。该方法运行之前的ArrayList如下所示(每个字母代表一个唯一的对象):

A 乙 乙 C 一种 乙 乙 一种 一种 乙 乙 乙 乙 C

运行该方法后,结果显示为:

C 一种 乙 乙 乙 C

我不明白为什么该方法会重新排列结果并仍然包含重复项,但是我怀疑这是由于thisList在内部for循环中发生了变化,但是整个for循环仍在使用thisList的原始值。那是对的吗?解决的办法是什么?

2 个答案:

答案 0 :(得分:3)

通过在列表上进行迭代时从列表中删除它,您正在弄乱逻辑。您不会像使用迭代器那样遇到明显的显式失败,但是正弦循环不会考虑已删除的项,而只是丢失了项。

一种更简单的方法是利用JDK的LinkedHashSet,它既可以保证每个值的单个实例又可以保留插入顺序:

private static ist<IndividualEntry> cleanList(List<IndividualEntry> inputList) {
    return new ArrayList<>(new LinkedHashSet<>(inputList));
}

这当然是假设您的IndividualEntry类正确实现了equals(Object)hashCode()方法。

答案 1 :(得分:3)

使用Java 8+,您可以执行以下操作删除重复项:

private static List<String> cleanList(List<String> inputList){
    return inputList.stream().distinct().collect(Collectors.toList());
}

这将创建List的流,仅接受唯一值,然后将它们收集到List