복붙노트

[SCALA] MutableList와 ListBuffer의 차이

SCALA

MutableList와 ListBuffer의 차이

scala.collection.mutable에서 스칼라의 MutableList과 ListBuffer 클래스의 차이점은 무엇입니까? 때 당신은 다른 대 하나를 사용해야합니까?

내 유스 케이스 I 효율적 첫번째 요소 앞에 추가 및 제거 할 수 APPEND 선형 서열을 가지고있다. 이에 가장 적합한 구조는 무엇입니까?

해결법

  1. ==============================

    1.작동 방식에 대한 약간의 설명.

    작동 방식에 대한 약간의 설명.

    ListBuffer 내부적 무기 호 및 사용 :: 불변의 목록을 구축하고 첫 번째와 마지막 요소의 일정 시간의 제거를 허용합니다. 이렇게하려면,리스트의 처음과 마지막 요소에 포인터를 유지하고, 실제로 (그렇지 않으면 불변) : 클래스의 머리와 꼬리 (민간 [스칼라]에서 허용하는 멋진 트릭의 var에 구성원을 변경할 수있다 : :). 직접적 구조가 내부적으로 유지하고 반환 할 수 있습니다로 그 toList 방법뿐만 아니라, 일정한 시간에 정상 불변의리스트를 돌려줍니다. 또한 불변의 목록에 대한 기본 빌더 (따라서 실제로 합리적으로 일정 시간의 APPEND이 예상 될 수있다). 당신이 toList를 호출 한 후 다시 버퍼에 요소를 추가하면 더 이상 내 보낸 목록을 변이 안, 그것은 새로운 구조를 다시 버퍼의 현재의 요소 수에 대한 선형 시간이 걸립니다.

    그 요소와 같은 후계자 (알고 : 가변 링크리스트의 구현 : MutableList 대신 LinkedList의와 내부적으로 (공개적으로,하지 등이 작동합니다 :). 결과 목록이 LinkedList의에서 구축 될 MutableList 또한, 선형 시간에 첫 번째와 마지막 요소에 대한 포인터 만 toList의 수익률을 유지합니다. 따라서,이 목록을 내 보낸 후 버퍼를 다시 초기화 할 필요가 없습니다.

    귀하의 요구 사항을 감안할 때, 나는 ListBuffer과 MutableList은 동일합니다라고 말하고 싶지만. 당신이 오버 헤드는 버퍼를 돌연변이에 가면 다음 목록을 내보낼 수없고, 경우 (다음 MutableList 갈), 또는 당신은을 변경할 경우에만 : 당신은 어떤 시점에서 내부 목록을 내보낼 경우에, 당신은 오버 헤드를 원하는 위치에 자신에게 물어 다시 버퍼없고, 수출시에 없음 (다음 ListBuffer 갈).

    내 생각 엔 2.8 수집 점검에 MutableList이 ListBuffer 전체 빌더 시스템을보다 선행한다는 것이다. 실제로 MutableList는 collection.mutable 패키지 내에서 주로 유용은 따라서 효과적으로 내부적 LinkedList의 유지 모든 구조에 대한 위임 빌더로서 사용될 수있다 일정한 시간에 복귀 전용 [가변] DEF toLinkedList 방법이있다.

    그것은 또한 MutableList와 LinkedList의 같은 "순수하게 변경할"구조보다 미래에 관심과 최적화를 얻을 수있다 그래서 나는 또한, ListBuffer을 권하고 싶습니다.

  2. ==============================

    2.이렇게하면 성능 특성에 대한 개요를 제공합니다 : http://www.scala-lang.org/docu/files/collections-api/collections.html을; 흥미롭게도, MutableList 및 ListBuffer가 할이 다를 수 없습니다. MutableList의 문서는 어쩌면 ListBuffer는 사용자의 관점에서 더 많은 공식 클래스는,이 스택과 큐에 대한 기본 클래스로 내부적으로 사용하고 있다고?

    이렇게하면 성능 특성에 대한 개요를 제공합니다 : http://www.scala-lang.org/docu/files/collections-api/collections.html을; 흥미롭게도, MutableList 및 ListBuffer가 할이 다를 수 없습니다. MutableList의 문서는 어쩌면 ListBuffer는 사용자의 관점에서 더 많은 공식 클래스는,이 스택과 큐에 대한 기본 클래스로 내부적으로 사용하고 있다고?

  3. ==============================

    3.당신은 가변 장과 수축하는 목록 (이유 목록을?)하려면, 당신은 일정한 APPEND 및 앞에 추가를합니다. 대부분의 다른 작업을 선형으로 음, 버퍼, 형질는 일정 APPEND 및 앞에 추가가 있습니다. 그 ListBuffer, 구현 버퍼, 첫 번째 요소의 일정 시간의 제거를 가지고 수업을 추측하고있어.

    당신은 가변 장과 수축하는 목록 (이유 목록을?)하려면, 당신은 일정한 APPEND 및 앞에 추가를합니다. 대부분의 다른 작업을 선형으로 음, 버퍼, 형질는 일정 APPEND 및 앞에 추가가 있습니다. 그 ListBuffer, 구현 버퍼, 첫 번째 요소의 일정 시간의 제거를 가지고 수업을 추측하고있어.

    그래서, 내 자신의 추천 ListBuffer입니다.

  4. ==============================

    4.첫째, 스칼라의 관련 유형의 일부를 가서 할 수 있습니다

    첫째, 스칼라의 관련 유형의 일부를 가서 할 수 있습니다

    목록 - 불변의 수집. 재귀 구현 즉. 즉 목록의 인스턴스는 두 가지 기본 요소 머리와 꼬리, 꼬리 참조 다른 목록을 가지고있다.

    List[T]
      head: T
      tail: List[T]  //recursive
    

    LinkedList의 - 각 노드 값과 다음 노드에 대한 포인터를 포함 링크 노드의 시리즈로 정의 된 가변 모음입니다.

    Node[T]
      value: T
      next: Node[T]  //sequential
    
    LinkedList[T]
      first: Node[T]
    

    목록 명령형 언어에서 더 표준 LinkedList의 비교 기능 데이터 구조 (불변)입니다.

    지금의 모습을 수 있습니다

    ListBuffer - 목록을 기본으로하는 가변 버퍼의 구현입니다.

    MutableList - LinkedList의에 근거하는 구현 (겠습니까 그것이 LinkedListBuffer 선정 된 경우 더 자명왔다 대신)

    둘 다 대부분의 작업에 유사한 복잡성 범위를 제공합니다.

    당신이 MutableList에서 목록을 요청하는 경우, 그것은 장 - 필립 펠렛 지적 무엇 @입니다 O (N)를 취하는 재귀 적 표현으로 기존의 선형 표현을 변환 할 수 있습니다. 당신이 MutableList에서 서열을 요청한다면, 복잡도는 O (1)이다.

    그래서, IMO 선택은 당신의 코드와 환경 설정의 세부 사항에 좁혀. 비록, 나는 더 많은 목록 및 ListBuffer 거기에있다 생각한다.

  5. ==============================

    5.당신이 MutableList을 확장 할 수 있습니다 동안 참고 ListBuffer 것으로, 최종 / 밀봉된다. 응용 프로그램에 따라 확장 유용 할 수 있습니다.

    당신이 MutableList을 확장 할 수 있습니다 동안 참고 ListBuffer 것으로, 최종 / 밀봉된다. 응용 프로그램에 따라 확장 유용 할 수 있습니다.

  6. from https://stackoverflow.com/questions/5446744/difference-between-mutablelist-and-listbuffer by cc-by-sa and MIT license