对于链表,我们应该在链表中找到重复项,然而,我所编写的方法似乎只遍历一次,并没有删除所有重复项。知道为什么会这样吗?
public void removeDuplicate(){
LinkedListIterator iter = new LinkedListIterator();
while(iter.hasNext()){
Object j = iter.next();
LinkedListIterator iter2 = iter;
while(iter2.hasNext()){
Object x = iter2.next();
if(x.equals(j))
iter2.remove();
}
}
}
当您需要删除重复项时。试着考虑Set接口
,在你的情况下,使用LinkedHashSet来维持秩序。
代码
Set uniqueList = new LinkedHashSet();
uniqueList.addAll(yourList);
System.out.println(uniqueList);
我假设您需要使用迭代器....
您的第一个问题是您创建了一个迭代器,但不是从列表创建的。如果你有一个列表myList
,你用myList.iterator()
创建一个迭代器。
你的第二个问题是LinkedListIterator iter2 = iter;
。你需要另一个不同的迭代器;您的语句使iter2
和iter
都指向同一个底层实例。
LinkedListIterator iter2 = iter;
你只有一个迭代器。此外,这似乎是伪代码,或者您没有使用标准Java库。
用Set代替List的所有建议当然都是有效的,如果这不是一个练习,这将是首选的方法。
这个解决方案更简单
List uniqueList = new LinkedList(new HashSet(list));
您可以使用:
Set<Foo> uniqueFoos = new LinkedHashSet<Foo>(myList);
myList.clear();
myList.addAll(uniqueFoos);
这一行
LinkedListIterator iter2 = iter;
不创建新的迭代器,而是创建对原迭代器的新引用。所以当你调用
iter2.hasNext()
在while
语句中,它正在推进iter(因为它与iter2相同)。当iter2完成后,iter也完成了。