从Java中的LinkedList中删除重复元素

时间:2011-11-17 04:34:43

标签: java while-loop linked-list duplicates

我一直致力于一项允许用户将对象输入到LinkedList中的任务,以及删除它们。我把我的程序的所有区域弄清楚了,除了这个讨厌的部分...删除重复。我已经有一段时间了,并且希望有人能指出我正确的方向。

我在几乎下面的代码工作......就像删除重复项一样......但只删除它遇到的第一个元素。那么,我如何允许程序查看第一个项目,删除它的副本,然后返回并对列表中的所有其他元素执行相同的操作?我应该使用像#34;之前的#34;和"当前"而不是我在这里得到的,并试图以这种方式遍历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 个答案:

答案 0 :(得分:3)

它应该是一种固定的方式。 但如果您不想更改原始订单,这可以提供帮助:

//在这里,您可以将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 :(得分:1)

如果空间不是问题,您可以随时将其复制到新列表,在插入之前验证它还不在新列表中:

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

答案 2 :(得分:0)

将其转换为Set,然后返回List。 2行代码。

答案 3 :(得分:0)

也许这可以帮助你,
新建一个hashMap,并将链接节点的字符串值作为键,在迭代列表时,检查该键是否已存在于hashMap中,如果是,则将其删除。

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

import java.util.HashSet;

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

public class 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;
}

}