0

I have the following code:

val copyA = a.clone
copyA(0)(0) = 1
println("a(0)(0): " + a(0)(0))

This prints:

a(0)(0): 1

If I change it to this:

val copyA = a.clone
println("a(0)(0): " + a(0)(0))

It prints:

a(0)(0): 0

So why is a affected by a change in copyA?

How can I make it such that changes in copyA don't affect a?

bsky
  • 19,326
  • 49
  • 155
  • 270

2 Answers2

3

Mutating the cloned 1D array instance won't change the original instance and vice-versa,

example,

scala> val original = Array(100, 200)
original: Array[Int] = Array(100, 200)

scala> val cloned = original.clone
cloned: Array[Int] = Array(100, 200)

mutating cloned array does not affect original array,

scala> cloned(0) = 5000

scala> original(0) //still the same value
res36: Int = 100

mutating original array does not affect cloned array,

scala> original(0) = 8888

scala> cloned(0) // still the same
res38: Int = 5000

But its different regarding 2D array, because each array inside is a ref and has to be deep cloned

scala> val original = Array.ofDim[Int](2,2)
original: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> original.foreach {col => println(col)}
[I@745e24c4
[I@42c6563f

deep cloning 2D array

scala> val cloned = original.map(_.clone)
cloned: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))

scala> original(0)(0) = 5000

scala> cloned(0)(0)
res43: Int = 0

//changing cloned does not change original array 
scala> cloned(0)(0) = 8888

scala> original(0)(0)
res48: Int = 5000
prayagupa
  • 30,204
  • 14
  • 155
  • 192
2

You cloned the array. You didn't clone whatever was in the array.

In your code, you are not manipulating the array. You are getting an element out of the array and manipulating that object. The arrays are completely irrelevant here.

Jörg W Mittag
  • 363,080
  • 75
  • 446
  • 653