2016-10-16 2 views
-3

배열의 초기 상태를 스칼라로 저장하는 가장 좋은 방법은 무엇인지 궁금해서 작업 복사본을 조작 한 후 초기 값으로 다시 설정할 수 있습니다. 이 같은 것을하고 싶습니다배열의 초기 상태를 저장하고 스칼라로 리셋

val initialValue = Array(Array(1,2,3),Array(4,5,6)) 
val workingCopy = initialValue.clone 

문제는 workingCopy의 값을 변경할 때 initialValue 값도 변경한다는 것입니다.

는 또한
val workingCopy = Array.fill(2,3)(0) 
Array.copy(initialValue,0,workingCopy,2) 

을 시도하지만 동일한 결과를 얻을.

배열을 정의 할 때 val 대신 var을 사용하는 경우에도 마찬가지입니다. 이 얕은 복사 동작은 중첩 된 Array 구조로 인해 발생할 수 있다고 생각하지만이를 처리하는 방법을 잘 모르겠습니다.

답변

1

안젤로에 의해 지적, 당신은 일반적으로이 같은 문제를 방지하기 위해 불변의 데이터 구조를 사용하고 싶습니다. 그러나 실제로 변경할 수있는 방법이 필요한 경우 성능상의 이유로 (불변 콜렉션의 "수정"(예 : Vector)이 생각만큼 비싸지는 않지만) 중첩 된 배열과 내용을 딥 복사해야합니다. 구현은 귀하에게 달려 있습니다.

val initialValue = Array(Array(1,2,3), Array(4,5,6)) 
val workingCopy = initialValue.map(_.clone) 

참조 형식을 사용하는 일반적인 예를 대신 간단한 Int의 :


정말 그냥 Array[Array[Int]] 경우

는,이 같은 뭔가를 충분
scala> class Cell(var x: String) { def copy = new Cell(x); override def toString = x } 
defined class Cell 

scala> val initialValue = Array(Array(new Cell("foo"))) 
initialValue: Array[Array[Cell]] = Array(Array(foo)) 

scala> val workingCopy = initialValue.map(_.map(_.copy)) 
workingCopy: Array[Array[Cell]] = Array(Array(foo)) 

scala> initialValue(0)(0).x = "bar" 
initialValue(0)(0).x: String = bar 

scala> initialValue 
res0: Array[Array[Cell]] = Array(Array(bar)) 

scala> workingCopy 
res1: Array[Array[Cell]] = Array(Array(foo)) 

initialValue.map(_.map(_.copy)) 대신에 다른 방법은 물론 있습니다. 같은 일을 (예 : 객체를 부작용으로 복사하는 중첩 된 for 표현식).

0

varval은 실제로 참조가 불변인지 여부를 결정하기 만하면 데이터 구조의 내용에 영향을 미치지 않습니다. 예를 들어 List과 같이 변경 불가능한 데이터 구조로 변환하려는 경우 해당 구조체의 내용을 "수정하는"작업으로 원본 참조를 그대로 유지 한 채 새로운 참조가 만들어 지므로 사본이 불필요하게됩니다. 예를 들어

:

val initialValue = List(List(1,2,3),List(4,5,6)) 

val sumInnerLists = initialValue.map(l => l.foldLeft(0)(_ + _)) 

println(sumInnerLists) // List(6, 15) 
println(initialValue) // List(List(1,2,3),List(4,5,6)) 
+0

대부분의 경우, 당신은 불변의 데이터 구조를 사용하고 싶다는 것을 알고 있습니다. 그러나, 내 데이터는 재귀 함수를 호출하려는 정말 큰 매트릭스이며, 재귀 적으로 함수를 호출하거나 매번 인수를 전달할 때마다 새 객체를 생성하고 싶지 않습니다 (훨씬 저렴합니다. 제자리에서 수정). –

+1

이 경우 초기 값을 불변의리스트로 만들고 배열 (또는 다른 가변 구조)으로 변환하여 작업 복사본을 얻을 수 있습니다. –

관련 문제