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

时间:2011-08-19 02:02:30

标签: 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 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);

仅仅为了记录,我理解第二个arraycopy语句,因为它只是一个简单的复制到数组aa。

我知道有很多关于SO的阵列复制问题,但我遇到的问题没有回答这个具体问题,因为我需要逐步了解复制如何匹配匹配。

无论如何,先谢谢你们。

1 个答案:

答案 0 :(得分:3)

我很确定算法中存在错误,因为第一个数组副本会覆盖数组前面的好数据。我认为该行应该是:

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]

好多了。副本1消失了。

作为补充说明,这是消除数组重复的非常可怕的方法。 所有重复的数组将执行(n *(n - 1)/ 2)个元素副本,这是荒谬的。重复数组的标准简单方法通常是将每个元素添加到HashSet,然后将该集合的内容迭代到新数组中。