Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
消除重复JAVA数组的最佳实现_Java_Arrays_Algorithm_Sorting - Fatal编程技术网

消除重复JAVA数组的最佳实现

消除重复JAVA数组的最佳实现,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,找到此解决方案以使此方法: 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;

找到此解决方案以使此方法:

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
int[]无重复项(int[]a){
int n=a.长度;
if(n<2){
返回a;
}
对于(inti=0;i
我不明白它为什么使用长度为n的数组。它的大小不应该是n减去删除的重复数吗?
这是实现该方法的最佳方式吗?或者我可以使用任何java资源吗?

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

--编辑--

private int[]不带重复项(int[]a){
Set Set=newlinkedhashset();
for(int x:a){
增加(x);
}
int[]newArray=newint[set.size()];
int ii=0;
用于(整数x:set){
newArray[ii++]=x;
}
返回新数组;
}

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

--编辑--

private int[]不带重复项(int[]a){
Set Set=newlinkedhashset();
for(int x:a){
增加(x);
}
int[]newArray=newint[set.size()];
int ii=0;
用于(整数x:set){
newArray[ii++]=x;
}
返回新数组;
}

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

publicstaticvoiddupcheck(int[]a){
int j=0;
HashMap=newHashMap();
int[]b=新的int[a.长度];

对于(int i=0;i,这里有一个用于删除重复项并保持相对顺序的算法。 时间:O(n) 空格:O(n)

publicstaticvoiddupcheck(int[]a){
int j=0;
HashMap=newHashMap();
int[]b=新的int[a.长度];

对于(int i=0;iIt是n减去重复数。
--n
它是n减去重复数。
--n
它改变了它的顺序。我认为这可能是重复擦除方法未消除的副作用;)
set.toArray(new int[]{})
不编译…如果方法签名使用Integer[]它会的。我假设它会执行自动取消装箱…我很快会更新。谢谢,很好的观察这里有一个固定的、可编译的实现。它还有保留顺序的额外好处。谢谢@pL4Gu33的捕获。它改变了它的顺序。我想这可能是重复擦除方法未消除的副作用;
set.toArray(new int[]{})
不会编译…如果方法签名使用Integer[],它会编译。我假设它会执行自动取消装箱…我会很快更新。谢谢,很好的观察这是一个固定的、可编译的实现。它还有保留顺序的额外好处。感谢@pL4Gu33的捕获。
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;
}
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]+" ");
    }