【问题标题】:Removing duplicate elements from a LinkedList in Java从 Java 中的 LinkedList 中删除重复元素
【发布时间】:2011-11-17 04:34:42
【问题描述】:

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

我在下面的代码 几乎 可以工作...因为它确实删除了重复项...但仅删除了它遇到的第一个元素。那么,如何让程序查看第一项,删除其重复项,然后返回并对列表中的所有其他元素执行相同操作?我应该使用像“previous”和“current”这样的节点而不是我在这里得到的节点,并尝试以这种方式遍历 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

【问题讨论】:

    标签: java while-loop linked-list duplicates


    【解决方案1】:

    它应该是一个固定的方式。 但如果您不想更改原始顺序,这会有所帮助:

    //这里,你可以认为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
    

    【讨论】:

    • 这绝对行得通!我想我将不得不放弃使用 Set,它比我尝试做的要容易得多.. 感谢您的帮助 =]
    【解决方案2】:

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

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

    【讨论】:

    • 我喜欢将列表复制到新列表的想法,因为空间绝对不是问题。感谢您的意见!
    【解决方案3】:
    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;
    }
    

    【讨论】:

    • 这快把我逼疯了。因此,如果将 for 循环中的 int 更改为 Integer,则上面的代码将不起作用,即使它有重复的条目,它也会完全按原样返回linkedList。使用 Integer 添加一些调试打印,我们确实将原始和重复项的正确索引放入 if() 中,但似乎 .remove 不起作用。
    • 我不知道,这个答案就像几年前一样。
    • uggh 这是因为有一个 remove(Object) 和 remove(int),如果你用 Integers 迭代你需要linkedList.remove((int) j) 然后它工作
    【解决方案4】:

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

    【讨论】:

    • 确保使用保持原始顺序的 Set。
    • 我们还没有在我的课程中讨论过 Sets,虽然我已经查阅过 Sets 并且似乎了解它在这种情况下的工作原理,但不幸的是,这不是一个选项... =/
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:
      import java.util.HashSet;
      

      导入 java.util.LinkedList; 导入 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;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 2020-05-27
        相关资源
        最近更新 更多