帮助理解使用arraycopy删除重复元素的java算法

帮助理解使用arraycopy删除重复元素的java算法,java,arrays,algorithm,Java,Arrays,Algorithm,我很难理解在这个算法中数组是如何被复制的。我对代码很满意,直到我到达下面显示的第12行。这段代码来自我正在学习的一本书。 我只是想了解每场比赛是如何进行复制的 编写了一些值来模拟场景 a = [10,4,6,10,5,2] a[0] = a[3] MATCH occurs when j=3 arraycopy(a, 4, a, 3, (5-3)) // Variable values substituted into arraycopy. (pretty sure they're corr

我很难理解在这个算法中数组是如何被复制的。我对代码很满意,直到我到达下面显示的第12行。这段代码来自我正在学习的一本书。 我只是想了解每场比赛是如何进行复制的

编写了一些值来模拟场景

a = [10,4,6,10,5,2]

a[0] = a[3] MATCH occurs when j=3 

arraycopy(a, 4, a, 3, (5-3)) // Variable values substituted into arraycopy. (pretty sure they're correct)            

System.arraycopy(a, j+1, a, 0, n-j); // Line 12   
整个代码:

    int n = a.length;

    if (n < 2){
        System.out.println("no duplicates");

    }

    for (int i = 0; i< n-1; i++)
        for (int j = i + 1; j < n; j++ )
            if(a[i] == a[j]){
                --n;                    
                System.arraycopy(a, j+1, a, 0, n-j); // Line 12   
                --j;                    


                System.out.println();
            }
    int[] aa = new int[n];
    System.arraycopy(a, 0, aa, 0, n);
int n=a.length;
if(n<2){
System.out.println(“无副本”);
}
对于(int i=0;i
为了记录在案,我理解了第二条arraycopy语句,因为它只是直接复制到数组aa中

我知道有很多关于arraycopy的问题,但是我遇到的那些问题并没有回答这个特定的问题,因为我需要一步一步地了解复制是如何匹配发生的


无论如何,先谢谢你们

我很确定算法中存在缺陷,因为第一个数组副本将覆盖数组前端的良好数据。我认为应该是:

System.arraycopy(a, j+1, a, j, n-j); // Line 12
这会将数组的末尾移到一个上面,只覆盖刚刚找到的一个副本

现在,它是这样工作的:

Before copy:
 i           j     n
[1, 2, 3, 4, 1, 5, 6]
                \  /
                n-j

After copy:
 i        j     n
[5, 6, 3, 4, 1, 5, 6]
After copy:
 i        j     n
[1, 2, 3, 4, 5, 6, 6]
显然是错的。现在有更多的重复比我们开始时

使用更新的行,它看起来如下所示:

Before copy:
 i           j     n
[1, 2, 3, 4, 1, 5, 6]
                \  /
                n-j

After copy:
 i        j     n
[5, 6, 3, 4, 1, 5, 6]
After copy:
 i        j     n
[1, 2, 3, 4, 5, 6, 6]
好多了。复制品1不见了


另外需要注意的是,这是一种从数组中消除重复项的非常可怕的方法。一个完全重复的数组将执行(n*(n-1)/2)个元素拷贝,这很可笑。消除数组重复的标准简单方法通常是将每个元素添加到一个
哈希集
,然后将该集的内容迭代到一个新数组中。

该算法应该做什么?它应该从数组中删除重复的数字。我正要在@kal上发表评论,询问我是否可以对arraycopy方法中的参数提出第二种意见,因为我感觉你说“好的数据正在被覆盖”。然后我就僵住了。非常感谢你,迪耶夫。我花了很长时间试图让它在我的脑海中语义上滴答作响。很高兴我能帮上忙!我在回答中添加了一个简短的提示,如果您感兴趣,可以使用更好的方法从数组中删除重复项。嘿@diev。刚才又看了一遍您上次的“复制后”解释,该解释在数组中仍然包含重复项。它看起来像一个无辜的打字错误。对不起,我应该详细说明一下。“6”现在在数组中被技术上“复制”,但它不是用于算法的目的。部分副本涉及将
n
减少1。由于
n
是新数组的最终大小,因此在
n
的当前值之后的任何内容实际上都会从数组中消失。