2012-02-16 4 views
36

LinkedHashMap은 삽입 순서를지도에 유지하는 데 사용되지만 변경 가능한지도에서만 작동합니다. 게재 신청서를 유지하는 불변의 Map 구현은 무엇입니까?삽입 순서를 유지하는 불규칙 스칼라 맵 구현

+1

이것은 정확한 사본이 아니며, 변경 불가능한지도에 대한 질문입니다. 주장되는 복제본은 변경 가능하고 변경 불가능한 것입니다. 다른 질문은 * 직접 * 불변 부분에 대답하지 않습니다 (아마도 간접적으로) –

답변

41

ListMap은 목록 기반 데이터 구조를 사용하여 변경 불가능한 맵을 구현하므로 삽입 순서가 유지됩니다.

scala> import collection.immutable.ListMap 
import collection.immutable.ListMap 

scala> ListMap(1 -> 2) + (3 -> 4) 
res31: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4) 

scala> res31 + (6 -> 9) 
res32: scala.collection.immutable.ListMap[Int,Int] = Map(1 -> 2, 3 -> 4, 6 -> 9) 

다음 확장 메서드

- ListMap의 작업을 할 때 Seq#toListMap은 매우 유용 할 수 있습니다.

scala> import scalaz._, Scalaz._, Liskov._ 
import scalaz._ 
import Scalaz._ 
import Liskov._ 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

implicit def seqW[A](xs: Seq[A]) = new SeqW(xs) 
class SeqW[A](xs: Seq[A]) { 
    def toListMap[B, C](implicit ev: A <~< (B, C)): ListMap[B, C] = { 
    ListMap(co[Seq, A, (B, C)](ev)(xs) : _*) 
    } 
} 


// Exiting paste mode, now interpreting. 

seqW: [A](xs: Seq[A])SeqW[A] 
defined class SeqW 

scala> Seq((2, 4), (11, 89)).toListMap 
res33: scala.collection.immutable.ListMap[Int,Int] = Map(2 -> 4, 11 -> 89) 
+1

ListMap에 문제가 있습니다 - 기존 키를 사용하여 update()를 호출하면 항목 순서가 변경됩니다. 예 :'ListMap ("a"→ 1, "b"→ 2) .updated ("a", 2) .toList'는'List ((b, 2), (a, 2))'를 산출합니다. 내 유스 케이스에 대한 불행 : ( –

20

ListMap은 삽입 순서를 유지하지만 매우 효율적이지는 않습니다. 검색 시간은 선형입니다. immutable.HashMapimmutable.TreeMap을 모두 래핑하는 새로운 컬렉션 클래스를 만드는 것이 좋습니다. 변경 불가능한 맵은 immutable.HashMap[Key, (Value, Long)]으로 매개 변수화되어야하며, 튜플에있는 LongTreeMap[Long, Key]에있는 해당 항목에 대한 포인터를 제공합니다. 그런 다음 옆에 진입 카운터를 두십시오. 이 트리 맵은 게재 신청서에 따라 항목을 정렬합니다.

삽입 및 조회는 간단한 방법으로 구현합니다. 즉, 카운터를 증가시키고, 해시 맵에 삽입하고 카운터 키 쌍을 트리 맵에 삽입합니다. 검색을 위해 해시 맵을 사용합니다.

트리 맵을 사용하여 반복을 구현합니다.

제거를 구현하려면 해시 맵에서 키 - 값 쌍을 제거하고 튜플의 인덱스를 사용하여 트리 맵에서 해당 항목을 제거해야합니다.

+3

+1. 가까운 미래에 stdlib에 그러한 콜렉션이있을 가능성이 있습니까? – missingfaktor

+0

이것은 계획되지 않았지만 스칼라 내부 메일 링리스트에 대한 토론에서 많은 사람들이 이것을 원한다면 그렇다면 이유는 무엇입니까? – axel22

+1

자세히 설명해 주시겠습니까 – axel22

관련 문제