为啥当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?

Posted

技术标签:

【中文标题】为啥当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?【英文标题】:Why does sub-arrays of a jagged array become sorted when I sort the sub-arrays of a copy of it?为什么当我对锯齿状数组的子数组进行排序时,它的子数组会被排序? 【发布时间】:2020-10-26 19:12:16 【问题描述】:

我有以下锯齿状数组-

int[][] triangle = 

    new int[]     3    ,
    new int[]    7,4   ,
    new int[]   2,4,6  ,
    new int[]  8,5,9,3 
;

然后我复制了它-

int[][] temporaryTriangle = new int[triangle.Length][];
Array.Copy(triangle, temporaryTriangle, triangle.Length);

我对副本的子数组进行了排序-

for (int i = 0; i < temporaryTriangle.Length; i++)

    Array.Sort(temporaryTriangle[i]);

我发现源数组的子数组也被排序了! 我的问题是为什么会发生这种情况,我的意思是当我对副本的子数组进行排序时,为什么数组的子数组会排序?

用法:

foreach (var subarray in triangle)
    Console.WriteLine(string.Join(" ", subarray));

foreach (var subarray in temporaryTriangle)
    Console.WriteLine(string.Join(" ", subarray));

// Output:
// 3
// 4 7
// 2 4 6
// 3 5 8 9
// 3
// 4 7
// 2 4 6
// 3 5 8 9

我问的是什么问题而不是如何解决它。所以Extremely fast way to clone the values of a jagged array into a second array? 没有回答我的问题。

【问题讨论】:

这能回答你的问题吗? Extremely fast way to clone the values of a jagged array into a second array? @OlivierRogier 我的问题是为什么会发生这种情况,而不是如何解决。 【参考方案1】:

虽然您认为您制作了该数组的副本(实际上您确实这样做了),但您只是深度复制了外部数组,并且每个元素都通过引用复制。您应该循环新数组,并将前一个数组的每个元素深复制到其中。

【讨论】:

【参考方案2】:

Array.Copy 仅复制单元格数组的第一级,即对子数组的引用数组...所以只有这些引用是重复的。

因此,作为重复问题提供的链接通过对每个子叶进行深层复制来解决问题。

您需要克隆每个子数组等:如果您有一个[][][]... 锯齿状数组,您需要逐个分支地管理树的每个级别,将每个级别与Array.Copy 复制到叶子和另一个Array.Copy

因此,如果您只复制第一级,然后如果您使用temporaryTriangle 修改叶子,则读取triangle 会导致从相同的单元格中获取值。

实际上只有temporaryTriangletriangle 的引用值(内存地址)不同:所有其他引用和内容在这些变量之间共享。

【讨论】:

【参考方案3】:

看来,您并没有复制子数组元素,您只是复制了triangle 中每个数组的引用。您可以使用此代码确认它

for (int i = 0; i < triangle.Length; i++)

    var result = ReferenceEquals(triangle[i], temporaryTriangle[i]);

每次迭代都会返回true。因此,在您的情况下,您应该手动复制每个元素

【讨论】:

【参考方案4】:

[ *pointerToArray, *pointerToArray2, *pointerToArray3 ]

当你复制时,你只复制引用/指针,而不是实际的数组本身。

您还必须复制内部数组。

【讨论】:

以上是关于为啥当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?的主要内容,如果未能解决你的问题,请参考以下文章

581-最短无序连续子数组

如何对数组字段中的子文档进行排序?

Leetcode 581.最短无序连续子数组

力扣----16. 最短无序连续子数组(JavaScript实现)

leetcode581 最短无序连续子数组(Easy不简单)

如何按列对二维数组(锯齿状)进行排序[重复]