当我对数组 B 进行排序时,数组 A 的内容发生了变化,这应该是 A 的副本
Contents of array A changes when I sort array B, which is supposed to be a duplicate of A
我有一个 10x 循环来对数字数组 B
(原始数组的副本 A
)进行排序并记录 运行 时间,因为数组在循环结束我创建了一个重复数组 B
进行更改,并使用 A
将其设置为新循环开始时的原始状态。
当它排序 B
时,A
也会自动排序,即使我只发送 B
也是如此。
为什么会发生这种情况以及如何改变它?
循环:
for (i in 1..10) {
val B = A
val time = measureTimeMillis {
val sorting = Insertion(B); sorting.sor
}
println(""+ cycle++ + "\t" + time)
}
排序:
class Insertion(var B: IntArray) {
fun sort(): Unit {
for( j in 1 until B.size){
var key = B[j]
var i = j-1
while( i > -1 && B[i] > key){
B[i+1] = B[i]
i= i - 1
}
B[i+1] = key
}
}
}
发生这种情况是因为您使用了相同的数组。在 val B = A
B
是对数组 A
的引用之后,没有创建副本。要创建副本,您需要调用 val B = A.copyOf()
.
在循环开始时,您有一个 IntArray
对象和一个引用它的变量:
A ──→ IntArray
然后创建第二个变量,它引用同一个 IntArray
对象。
A
>─→ IntArray
B
希望这说明了为什么通过引用 B
所做的更改也将通过引用 A
可见。
如果您希望 B
引用 不同的 IntArray
,您必须复制它,例如:
val B = A.copyOf()
或:
val B = A.clone()
或:
val B = IntArray(a.size){ A[it] }
或其他各种方式。 (copyOf()
通常是最好的。)
(最后请注意,Kotlin 约定变量、方法和属性以小写字母开头,只有 类 和类型参数以大写字母开头。)
我有一个 10x 循环来对数字数组 B
(原始数组的副本 A
)进行排序并记录 运行 时间,因为数组在循环结束我创建了一个重复数组 B
进行更改,并使用 A
将其设置为新循环开始时的原始状态。
当它排序 B
时,A
也会自动排序,即使我只发送 B
也是如此。
为什么会发生这种情况以及如何改变它?
循环:
for (i in 1..10) {
val B = A
val time = measureTimeMillis {
val sorting = Insertion(B); sorting.sor
}
println(""+ cycle++ + "\t" + time)
}
排序:
class Insertion(var B: IntArray) {
fun sort(): Unit {
for( j in 1 until B.size){
var key = B[j]
var i = j-1
while( i > -1 && B[i] > key){
B[i+1] = B[i]
i= i - 1
}
B[i+1] = key
}
}
}
发生这种情况是因为您使用了相同的数组。在 val B = A
B
是对数组 A
的引用之后,没有创建副本。要创建副本,您需要调用 val B = A.copyOf()
.
在循环开始时,您有一个 IntArray
对象和一个引用它的变量:
A ──→ IntArray
然后创建第二个变量,它引用同一个 IntArray
对象。
A
>─→ IntArray
B
希望这说明了为什么通过引用 B
所做的更改也将通过引用 A
可见。
如果您希望 B
引用 不同的 IntArray
,您必须复制它,例如:
val B = A.copyOf()
或:
val B = A.clone()
或:
val B = IntArray(a.size){ A[it] }
或其他各种方式。 (copyOf()
通常是最好的。)
(最后请注意,Kotlin 约定变量、方法和属性以小写字母开头,只有 类 和类型参数以大写字母开头。)