Удаление повторяющихся элементов из LinkedList в Java - PullRequest
3 голосов
/ 17 ноября 2011

Я работал над заданием, которое позволяет пользователю вводить объекты в LinkedList, а также удалять их.У меня есть все области моей программы, кроме этой надоедливой части ... удаление дубликатов.Я был в этом в течение некоторого времени, и надеялся, что кто-то может указать мне правильное направление.

Код, который я имею ниже почти , работает ... так же, как и в нем, удаляет дубликаты ... но только первого элемента, с которым он сталкивается.Итак, как я могу позволить программе просмотреть первый элемент, удалить его дубликаты, а затем вернуться и сделать то же самое для всех других элементов в списке?Должен ли я использовать узлы, такие как «предыдущий» и «текущий», а не то, к чему я здесь прихожу, и пытаться пройти таким образом LinkedList?Профессор намекал мне, что нужны два цикла while, но все способы, которые я пробовал, не сработали должным образом.Что я должен указать в качестве параметра для второго, и я предполагаю, внешнего цикла while?

Любая помощь с благодарностью, спасибо!

public void removeDuplicate() //searches the LinkedList for duplicate elements, and removes them
   {
   ListIterator iter = listIterator();

   Object uniqueO = iter.next();

        while (iter.hasNext())
        {
           String uniqueS = (String) uniqueO;
           Object compareO = iter.next();
           String compareS = (String) compareO;
           int x = uniqueS.compareTo(compareS);
           if (x == 0)
           {
               iter.remove();
           }
        }

} //end removeDuplicate

Ответы [ 6 ]

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

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

// здесь, вы можете рассматривать set как просто структуру данных, которая никогда не допустит дублирования:)

     public void removeDuplicate() //searches the LinkedList for duplicate elements, and removes them
   {
   ListIterator iter = listIterator();

    HashSet tempSet = new HashSet();


        while (iter.hasNext())
        {

        Object obj = iter.next();
                      if(tempSet.contains(obj))){
                          iter.remove();
                      }else{
                            tempSet.add(obj);
                      }
        }

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

Если пробел не имеет значения, вы всегда можете скопировать его в новый список, проверив перед вставкой, что его еще нет в новом списке:

public static LinkedList<Object> dedup(LinkedList<Object> original) {
    LinkedList<Object> copy = new LinkedList<Object>();

    for (Object o : original) {
        if (!copy.contains(o)) {
            copy.add(o);
        }
    }

    return copy;
}

Вы заявили, что у вас уже работает функция add, и вы можете довольно легко реализовать функцию простого содержимого для вашего LinkedList класса:

public boolean contains(Object o) {
    ListIterator iter = listIterator();

    while (iter.hasNext()) {
        if (iter.next().equals(o)) {
            return true;
        }
    }

    return false;
}
0 голосов
/ 10 января 2015
import java.util.HashSet;

import java.util.LinkedList; import java.util.Iterator;

открытый класс DeletDuplicateNodeinLinkList {

public static void main(String[] args) {

    LinkedList<Integer> myLL = new LinkedList<Integer>();

    myLL.add(1231);
    myLL.add(12);
    myLL.add(12313);
    myLL.add(123);
    myLL.add(12313);
    myLL.add(1);
    myLL.add(1243242);
    System.out.println(myLL);

    myLL = deleteDups(myLL);
    System.out.println(myLL);
}

private static LinkedList<Integer> deleteDups(LinkedList<Integer> myLL) {
    // TODO Auto-generated method stub

    HashSet<Integer> myHashSet = new HashSet<Integer>();
    Iterator<Integer> itr;
    itr = myLL.iterator();

    while (itr.hasNext()) {
        if (!myHashSet.add(itr.next())) {
            itr.remove();
        }

    }

    return myLL;
}

}

0 голосов
/ 26 сентября 2014
private LinkedList<String> removeDups(LinkedList<String> linkedList){
    for(int i=0; i<linkedList.size(); i++){
        for(int j=i+1; j<linkedList.size(); j++){
            if(linkedList.get(i).equals(linkedList.get(j))){
                linkedList.remove(j);
            }
        }
    }
    return linkedList;
}
0 голосов
/ 17 ноября 2011

Может быть, это поможет вам,
создайте новый hashMap и примите строковое значение узла ссылки в качестве ключа, при итерации списка проверьте, существует ли ключ в hashMap, если да, просто удалите его.

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

Преобразовать его в набор, а затем обратно в список.2 строки кода.

...