【问题标题】:Best implementation to remove duplicates JAVA array [duplicate]删除重复的JAVA数组的最佳实现[重复]
【发布时间】:2014-07-02 18:58:21
【问题描述】:

找到了这个解决方案来制作这个方法:

int[] withoutDuplicates(int[] a){
int n = a.length;
   if (n < 2) {
        return a; 
    }
    for (int i = 0; i < n-1; i++) { 
         for (int j = i+1; j < n; j++) {
               if (a[j] == a[i]) {
                 --n;
                 System.arraycopy(a, j+1, a, j, n-j);
                --j; 
             }//end if
        } //end for
     }//end for

     int[] aa = new int[n]; 
     System.arraycopy(a, 0, aa, 0, n); 
     return aa;

}//end method

我不明白为什么它使用长度为 n 的数组。它的大小不应该是 n 减去删除的重复项的数量吗? 这是实现该方法的最佳方式吗?或者有什么我可以使用的 java 资源?

【问题讨论】:

  • n减去重复的数量。 --n

标签: java arrays algorithm sorting


【解决方案1】:

我天生懒惰。我会这样做:

-- 编辑--

private int[] withoutDuplicates(int[] a){
    Set<Integer> set = new LinkedHashSet<Integer>();
    for (int x : a) {
        set.add(x);
    }
    int[] newArray = new int[set.size()];
    int ii = 0;
    for (Integer x : set) {
        newArray[ii++] = x;
    }
    return newArray;
}

【讨论】:

  • 它改变了它的顺序。我认为这可能是重复擦除方法的不良副作用;)
  • set.toArray(new int[]{}) 无法编译...如果方法签名使用 Integer[] 则可以。
  • 我以为它会执行自动拆箱...我会尽快更新。
  • 谢谢,很好的观察
  • 这是一个固定的、可编译的实现。它具有保留订单的额外好处。感谢@pL4Gu33 的收获。
【解决方案2】:

这是一种用于删除重复项并保持相对顺序的算法。 时间:O(n) 空间:O(n)

public static void dupCheck(int [] a){
        int j=0;
        HashMap<Integer,Boolean> map = new HashMap<Integer,Boolean>();
        int [] b = new int [a.length];
        for(int i=0;i<a.length;i++){
            if(!map.containsKey(a[i])){
                map.put(a[i],true);
                b[j++]=a[i];
            }
        }
        for(int i=0;i<j;i++)
            System.out.print(b[i]+" ");
    }

【讨论】:

    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2018-03-13
    • 2013-03-23
    • 2014-04-16
    • 1970-01-01
    • 2016-11-17
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多