어떻게 변환 할 수 있습니다 immutable.Map
에 mutable.Map
에 내가 값을 업데이트 할 수 있도록 스칼라 Map
?
어떻게 변환 할 수 있습니다 immutable.Map
에 mutable.Map
에 내가 값을 업데이트 할 수 있도록 스칼라 Map
?
답변:
가장 깨끗한 방법은 mutable.Map
varargs 공장 을 사용하는 것 입니다. ++
접근 방식 과 달리 이것은 CanBuildFrom
메커니즘을 사용 하므로이를 활용하기 위해 라이브러리 코드를 작성하면 더 효율적일 수 있습니다.
val m = collection.immutable.Map(1->"one",2->"Two")
val n = collection.mutable.Map(m.toSeq: _*)
이것은 Map
쌍의 시퀀스로도 볼 수 있기 때문에 작동합니다 .
: _*
컴파일러에게 주어진 표현식에 어떤 유형을 할당할지 정확히 알려주는 유형 지정과 매우 유사합니다. 여기서 "이 시퀀스를 가져 와서 여러 vararg 매개 변수로 취급"이라고 생각할 수 있습니다.
val myImmutableMap = collection.immutable.Map(1->"one",2->"two")
val myMutableMap = collection.mutable.Map() ++ myImmutableMap
O(1)
단계적 으로 영구 컬렉션으로 되돌릴 수 있다는 것을 알고 있습니다 . 이 외모 가 될 O(n)
그 얼마나 영리 구현에 당연히 달려 있지만, ++
있다.
O(n)
. O(n)
시간을 절약하기 위해 새 사본의 생성을 연기하거나 원래 맵 대신 변경 세트를 읽어 액세스 시간을 두 배로 늘릴 수 있지만 모든 것을 변경할 때 한계는이어야합니다 . 어느 것이 가장 잘 수행되는지는 아마도 사용 사례에 따라 다릅니다.
collection.breakOut을 사용하는 것은 어떻습니까?
import collection.{mutable, immutable, breakOut}
val myImmutableMap = immutable.Map(1->"one",2->"two")
val myMutableMap: mutable.Map[Int, String] = myImmutableMap.map(identity)(breakOut)
mutable.Map#apply
A가 더 상용구 비트와.
시작 Scala 2.13
, .to(factory)
다음 과 함께 적용된 팩토리 빌더를 통해 :
Map(1 -> "a", 2 -> "b").to(collection.mutable.Map)
// collection.mutable.Map[Int,String] = HashMap(1 -> "a", 2 -> "b")
Map
immutable에서 가져온 기본값을 가진 빈 mutable을 만드는 변형이 있습니다 Map
. 언제든지 값을 저장하고 기본값을 재정의 할 수 있습니다.
scala> import collection.immutable.{Map => IMap}
//import collection.immutable.{Map=>IMap}
scala> import collection.mutable.HashMap
//import collection.mutable.HashMap
scala> val iMap = IMap(1 -> "one", 2 -> "two")
//iMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))
scala> val mMap = new HashMap[Int,String] {
| override def default(key: Int): String = iMap(key)
| }
//mMap: scala.collection.mutable.HashMap[Int,String] = Map()
scala> mMap(1)
//res0: String = one
scala> mMap(2)
//res1: String = two
scala> mMap(3)
//java.util.NoSuchElementException: key not found: 3
// at scala.collection.MapLike$class.default(MapLike.scala:223)
// at scala.collection.immutable.Map$Map2.default(Map.scala:110)
// at scala.collection.MapLike$class.apply(MapLike.scala:134)
// at scala.collection.immutable.Map$Map2.apply(Map.scala:110)
// at $anon$1.default(<console>:9)
// at $anon$1.default(<console>:8)
// at scala.collection.MapLike$class.apply(MapLike.scala:134)....
scala> mMap(2) = "three"
scala> mMap(2)
//res4: String = three
주의 사항 (Rex Kerr의 주석 참조) : 변경 불가능한 맵에서 오는 요소를 제거 할 수 없습니다.
scala> mMap.remove(1)
//res5: Option[String] = None
scala> mMap(1)
//res6: String = one