Содержимое массива A изменяется, когда я сортирую массив B, который должен быть дубликатом A - PullRequest
2 голосов
/ 02 апреля 2019

У меня есть цикл 10x для сортировки массива чисел B (копия исходного массива A) и записи времени выполнения, так как массив сортируется в конце цикла, я создал дубликат массива B нужно изменить и использовать A, чтобы установить его в исходное состояние в начале нового цикла.

при сортировке B, A автоматически сортируется, даже если я только отправляюB.почему это происходит и как это изменить?

loop:

for (i in 1..10) {
        val B = A
        val time = measureTimeMillis {
                val sorting = Insertion(B); sorting.sor
        }
        println(""+ cycle++ + "\t" + time)
}

sort:

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
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

В начале вашего цикла у вас есть объект 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 для переменных, методов и свойств должно начинаться с буквы нижнего регистра, и только классы и параметры типа должны начинаться с заглавной буквы.)

2 голосов
/ 02 апреля 2019

Это происходит потому, что вы используете тот же массив. После того, как val B = A B является ссылкой на массив A, копия не была создана. Для создания копии вам нужно позвонить val B = A.copyOf().

...