2014-11-19 9 views
2

스칼라가 불변의 데이터 구조를 지원한다는 것을 알고 있습니다. 목록을 업데이트 할 때마다 힙에서 새로운 객체와 참조를 생성합니다. 내가 목록에 두 번째 요소를 추가 할 때스칼라에서 변경할 수없는 데이터 구조

val xs:List[Int] = List.apply(22) 
val newList = xs ++ (33) 

는 그래서 모두 (22)를 포함하고 33.This 정확하게 자바에서 어떻게 작동하는지 불변 문자열처럼 작동하는 새로운 목록을 생성합니다. 그래서 질문은 목록에 요소를 추가 할 때마다 새로운 개체가 매번 생성 될 것입니다.이 방법은 효율적이지 않습니다. 거기에 영구 데이터 구조와 같은 몇 가지 특별한 데이터 구조가 있습니다.이 문제를 처리 할 때 사용됩니다.

+0

불변성을 선호하는 좋은 이유가 있습니다. 이러한 이유에 대한 좋은 요약은 ** Effective Java **, Item 15에서 찾아 볼 수 있습니다. 성능 문제를 해결하기 위해 mutable 데이터 구조의 효율적인 내부 구현에 의존하거나 변경할 수있는 부분을 사용하는 것이 좋습니다 (예 :'ListBuffer'). –

+0

리스트는 prepending 할 때만 효율적입니다. 추가하려는 경우 벡터 데이터 구조를 사용하는 IndexedSeq을 사용하십시오. 그것은 appending과 prepending 모두에 대해 합리적으로 효율적이며 또한 불변입니다. –

답변

1

목록에 추가하는 것은 복잡성이 O (n)이며 비효율적입니다. 일반적인 방법은 목록을 작성하는 동안 목록 앞에 추가하고 마지막으로이를 취소하는 것입니다.

이제 새 개체 만들기에 대한 질문이 앞자리에도 적용됩니다. xs은 불변이므로 newList은 앞 뒤의 나머지 데이터에 대해 xs를 가리 키기 만합니다.

+0

정확히하지만 질문은 그것이 데이터가 변경되지 않을 때까지 나머지 데이터를 가리킬 수 있다는 것입니다. 예를 들어, 나는 val list = List (12,13,14)와 같은리스트를 가지고 있는데, 불변의 목록 ie (list1 = list + 15) 그것은 새로운리스트를 생성하지 않을 것입니다. 그것은 이전의 linkedlist를 사용할 것이고 포인터는 시작 즉 12의 주소를 가리키고 15를위한 새로운 노드를 만들 것입니다. 목록 참조를 사용하여 데이터를 변경하면 목록 1을 사용하여 새 목록을 작성 (예 : 이전 데이터 복사)하고 목록 참조를 수정합니다.이를 영구 데이터 구조라고합니다. –

1

@manojlds가 그의 분석에서 옳은 반면, 원래 게시물은 작업을 수행 할 때마다 목록 노드를 복제하는 효율성에 대해 질문했습니다.

@manojlds가 말한 것처럼, 목록을 구성하려면 종종 역방향으로 생각해야합니다. 즉, 목록을 작성한 다음이를 뒤집어 야합니다. 목록 건물에는 "불필요한"복사가 필요한 여러 가지 상황이 있습니다. 그러나

val xsa = ListBuffer[Int](22) 
xsa += 33 
val newList = xsa.toList 

, 사실 그 :이를 위해

는 스칼라에서 사용할 수있는 가변 데이터 구조는 당신이 당신의 목록을 구축하고 불변의리스트로 결과를 추출하는 데 사용할 수있는 ListBuffer라고있다 목록 데이터 구조는 일반적으로 불변이므로 목록을 분석, 작성 및 재구성하는 데 매우 유용한 도구가 있습니다. 많은 내장 명령은 불변성을 이용합니다. 확장을 통해, 여러분 자신의 프로그램 또한 이러한 불변성을 이용할 수 있습니다.

+0

네,하지만 문제는 제가 프로그램에서 가변적 인 상태를 가져오고 싶지 않다는 것입니다. 변수 xsa는 변경 가능하며 누구나 위험한 징조 인 상태를 수정할 수 있습니다. 그래서 scala.collection.immutable.에서 사용할 수있는 불변의 데이터 구조를 사용해야합니다. –

+0

'xsa'는 변수가 아닙니다 ... "상태"는 항상'ListBuffer'입니다. 목록 버퍼가 작성되면 목록 버퍼의 내용이 변경 될 수 있습니다. 그러나, 그것은 당신이 그것을 구축하고있는 기간 동안입니다.목록으로 변환하면 더 이상 변경할 수 없습니다. 불변의 지점은 당신이 변경 가능성을 캡슐화한다는 것입니다. –

관련 문제