【问题标题】:How to remove all duplicates from an array如何从数组中删除所有重复项
【发布时间】:2017-04-07 16:20:02
【问题描述】:

我想从 Java 中的数组中删除每个重复项,并将剩余的整数存储在同一个数组中。

例如:int[] = { 5,5,5,3,4,4,2,2,1}; ==> int[] = {3,1};

到目前为止,我已经尝试过使用:

Set<Integer> set = new HashSet<Integer>();

for (int i = 0; i < array.length; i++) {
  set.add(array[i]);
}

不过,这似乎只删除了其中一个重复项,而不是两者。

任何帮助将不胜感激。

【问题讨论】:

  • @Marc H. 我编辑了我的代码,你可以测试一下。
  • 请添加更多上下文。你现在展示的只是一个将元素添加到集合中的循环。然后呢?
  • 一个可能的问题是 Java 数组不可调整大小。您如何处理曾经包含重复项的数组元素?
  • @Okapist 骗子是关于 ArrayList,而不是数组。

标签: java arrays


【解决方案1】:

您可以使用 HashMap 来维护每个元素的计数,并删除那些计数大于 1 的元素。

public int[] removeDuplicates(int[] arr) {
   Map<Integer, Integer> countMap = new LinkedHashMap<>(); // To maintain the order
   for (int n : arr) {
      Integer count = countMap.get(n);
      if (count == null) {
         count = 0;
      }
      count++;
      countMap.put(n, count);
   }

   for(Iterator<Map.Entry<String, String>> it = countMap.entrySet().iterator(); it.hasNext(); ) {
      Map.Entry<String, String> entry = it.next();
      if (entry.getValue() > 1) {
         it.remove();
      }
   }

   return new ArrayList<>(countMap.keySet()).toArray(new int[0]);
}

【讨论】:

    【解决方案2】:

    你连个set都不用,很简单,把数组转成List然后用Collections.frequency检查重复,如下图:

        Integer[] array = { 5,5,5,3,4,4,2,2,1};
        List<Integer> listInputs = Arrays.asList(array);
        List<Integer> listOutputs = new ArrayList<>();
        for(int value : listInputs) {
             if(Collections.frequency(listInputs, value) ==1) {
                 listOutputs.add(value);
             }
        }
        System.out.println(listOutputs);
    

    输出:[3, 1]

    【讨论】:

    • 感谢您的回答。可悲的是,我总是收到以下警告: List 类型不是通用的;它不能用参数 参数化
    • 这是个好主意。但是Collections.frequency() 的运行时间是O(n),这很糟糕。此代码的总运行时间为O(n^2)。
    【解决方案3】:

    这应该有效:

    int[] 数组 = { 5,5, 5, 3, 4, 4, 2, 2, 1};

     Arrays.sort(array);
     Set<Integer> set = new HashSet<Integer>();
    
     Set<Integer> duplicateSet = new HashSet<Integer>();
    
     for (int i = 0; i < array.length; i++) {
    
         if(!set.add(array[i])){
             duplicateSet.add(array[i]);
         }
     }
    
    
     System.out.println(duplicateSet.toString());
     set.removeAll(duplicateSet);
     System.out.println(set.toString());
    

    输出:

    [1,3]
    

    【讨论】:

    • 如果有奇数个重复,这将不起作用
    猜你喜欢
    • 2021-10-23
    • 2020-12-28
    • 2011-04-11
    相关资源
    最近更新 更多