지도에 키 또는 값이 있는지 확인하는 방법은 무엇입니까?


88

스칼라 맵이 있고 맵에 특정 값이 있는지 테스트하고 싶습니다.

myMap.exists( /*What should go here*/ )

답변:


143

의미에 따라 여러 가지 옵션이 있습니다.

"값" 키-값 쌍 을 의미하는 경우 다음과 같이 사용할 수 있습니다.

myMap.exists(_ == ("fish",3))
myMap.exists(_ == "fish" -> 3)

키-값 쌍의 값 을 의미하는 경우 다음을 수행 할 수 있습니다.

myMap.values.exists(_ == 3)
myMap.exists(_._2 == 3)

당신은 단지 테스트하고 싶었다면 키 - 값 쌍의 키를 누른 다음,

myMap.keySet.exists(_ == "fish")
myMap.exists(_._1 == "fish")
myMap.contains("fish")

튜플 형식 (예 :) _._1 == "fish"이 더 짧아 지 더라도 약간 더 긴 형식은 원하는 작업에 대해 더 명확하게 나타냅니다.


13
키의 존재를 테스트하기 위해, 라이브러리 ( "물고기") myMap.contains을 제공한다는 말 또한 가치
데이브 그리피스

2
@DaveGriffith-그렇습니다. 나는 단지 "exists"를 사용하고 있었지만, 추가 할만큼 충분히 중요 합니다 .
Rex Kerr

25

이 맵에 있는지 또는 키에 있는지 알고 싶 습니까? 키를 확인하려면 isDefinedAt다음을 사용하십시오 .

myMap isDefinedAt key

9

맵 값 중 하나가 통과하는지 테스트합니다.

val mymap = Map(9->"lolo", 7->"lala")
mymap.exists(_._1 == 7) //true
mymap.exists(x => x._1 == 7 && x._2 == "lolo") //false
mymap.exists(x => x._1 == 7 && x._2 == "lala") //true

ScalaDocs는 "이 불변 맵의 일부 요소에 대해 술어가 보유하고 있는지 여부를 테스트합니다."라는 메소드에 대해 설명합니다. 문제는 두 개의 매개 변수 대신 튜플 (키, 값)을 수신한다는 것입니다.


6

이것에 대해 :

val map = Map(1 -> 'a', 2 -> 'b', 4 -> 'd')
map.values.toSeq.contains('c')  //false

true지도에 c가치가 있으면 수익을 올립니다 .

사용을 고집하는 경우 exists:

map.exists({case(_, value) => value == 'c'})

2
values새로운 Iterable것을 생성합니다. 그래서 당신은 아마 더 나아질 것입니다 map.valuesIterator.contains('c')(그것만큼 쉽지는 않지만 map.exists(_._2 == 'c')!)
Luigi Plinge

3

위의 답변에 따라 exists ()는 contains ()보다 훨씬 느립니다 (5000 개의 문자열 키를 포함하는 Map으로 벤치마킹했으며 비율은 일관된 x100이었습니다). 나는 스칼라에 비교적 익숙하지 않지만 내 추측은 exists ()가 모든 키 (또는 키, 값 튜플)를 반복하는 반면 contains는 Map의 임의 액세스를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.