我有一个方法旨在从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
的原始值。那是对的吗?解决的办法是什么?
答案 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