对于链接列表,我们应该在链表中找到重复项,但是,我编写的方法似乎只进行一次,并且不会删除所有重复项。对于为什么会这样做的任何想法?
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();
}
}
}
答案 0 :(得分:3)
何时需要删除重复项。 试着想一下Set interface
并在您的情况下使用LinkedHashSet来维持秩序。
这是代码
Set uniqueList = new LinkedHashSet();
uniqueList.addAll(yourList);
System.out.println(uniqueList);
答案 1 :(得分:2)
我假设您需要使用迭代器....
您的第一个问题是您创建了一个迭代器,但不是从您的列表中创建的。如果您有一个列表myList
,则使用myList.iterator()
创建一个迭代器。
你的第二个问题是LinkedListIterator iter2 = iter;
。你想要另一个不同的迭代器;您的语句使iter2
和iter
指向同一个基础实例。
答案 2 :(得分:1)
LinkedListIterator iter2 = iter;
你只有一个迭代器。此外,这似乎是伪代码,或者您没有使用标准Java库。
集合而不是列表的所有建议当然都是有效的,如果这不是练习,那么它将是首选方式。
答案 3 :(得分:0)
此解决方案更简单
List uniqueList = new LinkedList(new HashSet(list));
答案 4 :(得分:0)
您可以使用:
Set<Foo> uniqueFoos = new LinkedHashSet<Foo>(myList);
myList.clear();
myList.addAll(uniqueFoos);
答案 5 :(得分:0)
这一行
LinkedListIterator iter2 = iter;
不会创建新的迭代器,而是创建对原始迭代器的新引用。所以当你打电话时
iter2.hasNext()
在你的while
语句中,它正在推进它(因为它与iter2相同)。所以当iter2完成时,它也是如此。他们是一样的。