无法从链接列表中删除重复项

时间:2011-11-17 17:01:21

标签: java iterator linked-list

对于链接列表,我们应该在链表中找到重复项,但是,我编写的方法似乎只进行一次,并且不会删除所有重复项。对于为什么会这样做的任何想法?

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

   }

6 个答案:

答案 0 :(得分:3)

何时需要删除重复项。 试着想一下Set interface

并在您的情况下使用LinkedHashSet来维持秩序。

这是代码

Set uniqueList = new LinkedHashSet();
uniqueList.addAll(yourList);
System.out.println(uniqueList);

答案 1 :(得分:2)

我假设您需要使用迭代器....

您的第一个问题是您创建了一个迭代器,但不是从您的列表中创建的。如果您有一个列表myList,则使用myList.iterator()创建一个迭代器。

你的第二个问题是LinkedListIterator iter2 = iter;。你想要另一个不同的迭代器;您的语句使iter2iter指向同一个基础实例。

答案 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完成时,它也是如此。他们是一样的。