2016-11-15 62 views
2

ListBuffer[ListBuffer[Int]]var x在我使用的功能clone克隆和設置到另一個var y,然後我用這個新var y功能update來更新內容,但是當我檢查var x的原始內容與var y相同嗎?爲什麼是這樣?我究竟做錯了什麼?他們是一種解決方法嗎?我試圖實現ListBuffer的副本,我可以在不更改初始ListBuffer的原始內容的情況下進行修改。克隆ListBuffer一成不變的問題斯卡拉

回答

4

clone不僅使淺拷貝,你需要深拷貝:

scala> import collection.mutable.ListBuffer 
import collection.mutable.ListBuffer 

scala> var a = ListBuffer(ListBuffer(1, 2), ListBuffer(3,4)) 
a: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1, 2), ListBuffer(3, 4)) 


scala> var b = a.clone 
b: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1, 2), ListBuffer(3, 4)) 

scala> b(0)(0) = 100 

scala> a 
res1: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> b 
res2: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> var c = a.clone.map(_.clone) 
c: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 

scala> c(0)(0) = 1000 

scala> c 
res3: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(1000, 2), ListBuffer(3, 4)) 

scala> a 
res4: scala.collection.mutable.ListBuffer[scala.collection.mutable.ListBuffer[Int]] = ListBuffer(ListBuffer(100, 2), ListBuffer(3, 4)) 
+0

爲了實現深拷貝,是'變種C = a.clone.map(_克隆。)'理想的方式是什麼? –

+0

對於這樣簡單的事情,我會說是的,對於更復雜或更深層的東西,你可能需要一個更好的解決方案(如[this](https://github.com/kostaskougios/cloning)?)。 –