为啥当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?
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
会导致从相同的单元格中获取值。
实际上只有temporaryTriangle
和triangle
的引用值(内存地址)不同:所有其他引用和内容在这些变量之间共享。
【讨论】:
【参考方案3】:看来,您并没有复制子数组元素,您只是复制了triangle
中每个数组的引用。您可以使用此代码确认它
for (int i = 0; i < triangle.Length; i++)
var result = ReferenceEquals(triangle[i], temporaryTriangle[i]);
每次迭代都会返回true
。因此,在您的情况下,您应该手动复制每个元素
【讨论】:
【参考方案4】:[ *pointerToArray, *pointerToArray2, *pointerToArray3 ]
当你复制时,你只复制引用/指针,而不是实际的数组本身。
您还必须复制内部数组。
【讨论】:
以上是关于为啥当我对锯齿状数组的子数组进行排序时,它的子数组会被排序?的主要内容,如果未能解决你的问题,请参考以下文章
力扣----16. 最短无序连续子数组(JavaScript实现)