Проблемы с удалением дубликатов из LinkedList - PullRequest
0 голосов
/ 17 ноября 2011

Для связанного списка мы должны найти дубликаты в связанном списке, однако метод, который я написал, кажется, проходит только один раз и не удаляет все дубликаты. Любая идея о том, почему он это делает?

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 ]

3 голосов
/ 17 ноября 2011

когда вам нужно удалить дубликаты. попробуй подумать об интерфейсе Set

и в вашем случае используйте LinkedHashSet для поддержания порядка.

Вот код

Set uniqueList = new LinkedHashSet();
uniqueList.addAll(yourList);
System.out.println(uniqueList);
2 голосов
/ 17 ноября 2011

Я предполагаю, что вам нужно использовать итератор ....

Ваша первая проблема в том, что вы создали итератор, но не из своего списка.Если у вас есть список myList, вы создаете итератор с myList.iterator().

Ваша вторая проблема LinkedListIterator iter2 = iter;.Вы хотите другой другой итератор;ваше утверждение заставляет iter2 и iter указывать на один и тот же базовый экземпляр.

1 голос
/ 17 ноября 2011

LinkedListIterator iter2 = iter;

У вас есть только один итератор.Кроме того, это, кажется, псевдокод, или вы не используете стандартную библиотеку Java.

Все предложения для набора вместо списка, конечно, действительны и будут предпочтительным способом, если это не такупражнение.

0 голосов
/ 17 ноября 2011

Эта строка

LinkedListIterator iter2 = iter;

создает не новый итератор, а новую ссылку на исходный итератор. Поэтому, когда вы звоните

iter2.hasNext()

в вашем while утверждении, оно продвигает iter (потому что оно совпадает с iter2) Так что, когда iter2 сделано, то и iter. Они одинаковы.

0 голосов
/ 17 ноября 2011

Вы можете использовать:

Set<Foo> uniqueFoos = new LinkedHashSet<Foo>(myList);
myList.clear();
myList.addAll(uniqueFoos);
0 голосов
/ 17 ноября 2011

Это решение проще

List uniqueList = new LinkedList(new HashSet(list));
...