scala.collection.mutable.Map에 요소를 추가하는 구문은 무엇입니까?


81

scala.collection.mutable.Map에 요소를 추가하는 구문은 무엇입니까?

실패한 시도는 다음과 같습니다.

val map = scala.collection.mutable.Map

map("mykey") = "myval"

map += "mykey" -> "myval"

map.put("mykey","myval")

이러한 주석은 스칼라 함수의 이름이 얼마나 나쁘고 그것이 얼마나 반 직관적인지를 보여줍니다!
Adelin

답변:


93

요점은 코드의 첫 번째 줄이 예상 한 것과 다르다는 것입니다.

다음을 사용해야합니다.

val map = scala.collection.mutable.Map[A,B]()

그런 다음 항목을 추가 할 여러 동등한 대안이 있습니다.

scala> val map = scala.collection.mutable.Map[String,String]()
map: scala.collection.mutable.Map[String,String] = Map()


scala> map("k1") = "v1"

scala> map
res1: scala.collection.mutable.Map[String,String] = Map((k1,v1))


scala> map += "k2" -> "v2"
res2: map.type = Map((k1,v1), (k2,v2))


scala> map.put("k3", "v3")
res3: Option[String] = None

scala> map
res4: scala.collection.mutable.Map[String,String] = Map((k3,v3), (k1,v1), (k2,v2))

그리고 시작 Scala 2.13:

scala> map.addOne("k4" -> "v4")
res5: map.type = HashMap(k1 -> v1, k2 -> v2, k3 -> v3, k4 -> v4)

4
아아, new빈 괄호를 사용할 때 불필요합니다.
Daniel C. Sobral

45

항상 그렇듯이 변경 가능한 맵이 진정으로 필요한지 질문해야합니다.

변경 불가능한지도는 간단하게 구축 할 수 있습니다.

val map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

변경 가능한 맵은 처음 빌드 될 때 다르지 않습니다.

val map = collection.mutable.Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

이 두 경우 모두 Map 인스턴스에 대한 올바른 유형 매개 변수를 결정하는 데 추론이 사용됩니다.

에서 변경 불가능한지도를 보유 할 수도 있습니다. var그러면 "업데이트"를 수행 할 때마다 변수가 새로운 변경 불가능한지도 인스턴스로 업데이트됩니다.

var map = Map(
  "mykey" -> "myval",
  "myotherkey" -> "otherval"
)

map += "nextkey" -> "nextval"

초기 값이없는 경우 Map.empty를 사용할 수 있습니다.

val map : Map[String, String] = Map.empty //immutable
val map = Map.empty[String,String] //immutable
val map = collection.mutable.Map.empty[String,String] //mutable

2
Map 필드가있는 클래스가 있고 언제든지 업데이트 할 수 있다고 가정 해 보겠습니다. Scala에서 'val'+ 가변 맵보다는 'var'+ 불변 맵을 갖는 것이 정말 선호됩니까? 숙련 된 Java 프로그래머로서 두 번째 옵션을 선택했지만 귀하의 답변에서 첫 번째 옵션이 Scala 세계에서 더 일반적이라고 가정합니까?
omnomnom

1
그리고 당신은 한 번에 여러 항목을 추가하려면 :map ++ Seq("another1" -> "anotherVal1", "another2" -> "anotherVal2")
브렌트 파우스트

18

네가 얘기 할 때

val map = scala.collection.mutable.Map

맵 인스턴스를 생성하지 않고 대신 Map 유형의 별칭을 지정합니다.

map: collection.mutable.Map.type = scala.collection.mutable.Map$@fae93e

대신 다음을 시도하십시오.

scala> val map = scala.collection.mutable.Map[String, Int]()
map: scala.collection.mutable.Map[String,Int] = Map()

scala> map("asdf") = 9

scala> map
res6: scala.collection.mutable.Map[String,Int] = Map((asdf,9))

3

변경 불가능한 새 맵을 만듭니다.

scala> val m1 = Map("k0" -> "v0")   
m1: scala.collection.immutable.Map[String,String] = Map(k0 -> v0)

위지도에 새 키 / 값 쌍을 추가하고 둘 다 변경할 수 없으므로 새지도를 만듭니다.

scala> val m2 = m1 + ("k1" -> "v1")             
m2: scala.collection.immutable.Map[String,String] = Map(k0 -> v0, k1 -> v1)

2
var test = scala.collection.mutable.Map.empty[String, String]
test("myKey") = "myValue"

2

초기 값없이 변경 가능한지도 만들기 :

scala> var d= collection.mutable.Map[Any, Any]()
d: scala.collection.mutable.Map[Any,Any] = Map()

초기 값으로 변경 가능한 맵을 만듭니다.

scala> var d= collection.mutable.Map[Any, Any]("a"->3,1->234,2->"test")
d: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, a -> 3, 1 -> 234)

기존 키-값 업데이트 :

scala> d("a")= "ABC"

새 키-값 추가 :

scala> d(100)= "new element"

업데이트 된지도 확인 :

scala> d
res123: scala.collection.mutable.Map[Any,Any] = Map(2 -> test, 100 -> new element, a -> ABC, 1 -> 234)

0

var map : Map [String, String] = Map ()

var map1 = map + ( "red"-> "# FF0000")

println (맵 1)


1
무섭고 외로운 코드의 그 불쌍한 조각은 설명으로 회사와 보호를 구걸하고 있습니다.
Yunnosch

3
SO에 오신 것을 환영합니다. 이렇게 오래된 질문 (10 년 이상 전에 질문 했음)과 이미 제출 된 답변이 너무 많기 때문에 답변이 주제에 새로운 것을 추가하는 방법을 지적하는 것이 도움이됩니다. 현재 게시물은 매우 열악한 Scala 스타일을 표시합니다.
jwvh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.