2016-11-15 5 views
2

Ich habe ein var x vom Typ ListBuffer[ListBuffer[Int]] in dem ich das Klonieren der Funktion clone und Einstellung auf einem anderen var y verwenden, verwende ich dann die Funktion update auf diese neuen var y den Inhalt zu aktualisieren, aber wenn ich das überprüfen Original Inhalt von var x es ist das gleiche wie var y? Warum ist das? Was mache ich falsch? Ist das ein Workaround? Ich versuche, eine Kopie von ListBuffer zu erreichen, die ich ändern kann, ohne den ursprünglichen Inhalt des ursprünglichen ListBuffer zu ändern.Cloning ListBuffer unveränderliche Ausgabe Scala

Antwort

4

clone macht nur eine flache Kopie, müssen Sie eine tiefe Kopie:

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

Um eine tiefe Kopie zu erreichen, ist 'var c = a.clone.map (_ Klon.)' Auf ideale Art und Weise? –

+0

Für einfache Dinge wie dies würde ich ja sagen, für etwas komplizierter oder tiefer könnte eine bessere Lösung (wie [this] (https://github.com/kostaskougios/cloning)?). –