2012-02-28 3 views
4

지도를 반복하고 특정 키를 필터링하는 가장 좋은 방법은 무엇입니까? 이 거대한 맵과 거대한 세트의 경우, 의사는 나 ', 동등하게지도를 반복하면서 키를 필터링하는 중

+0

은 기존 변경, 그 키를 사용하지 않는 새로운 맵을 만드시겠습니까 그 키를 제거하거나, 그 키를 제외한 모든 키/값에 대해 몇 가지 작업을 수행하여 맵을 변경할 수 있습니까? –

+0

@ DanielC.Sobral 마지막 옵션입니다. 최대 2000 개의 전체 항목과 최대 약 20 개의 제외 된 키가있는지도입니다. 지도는 자주 업데이트됩니다 (제외 된 키와 포함 된 키 모두).하지만이 특정 작업에 포함 된 키만 액세스하고 싶습니다. 따라서 메모리 및 업데이트 고려 사항에 대한 단일 맵을 선호합니다. –

+0

가능한 복제본 [키 집합 별 필터 맵] (0120-558-100)/ –

답변

10
val m = Map(1 -> "a", 2 -> "b", 4 -> "c", 10 -> "d") 
val s = Set(1,4) 
m.filterKeys { s.contains(_) == false } 
// Map(2 -> b, 10 -> d) 

브루스

map.foreach(tuple where !list.contains(tuple._1) => { }) 

감사 같을 그러나 수 우선 그들을 정렬하고 그들을 반복하면서, 당신이 갈 때 필요한 비트를 집어내는 것이 좋습니다. contains에 대한 반복 호출은 특히 대신 List을 사용하는 경우 원하는대로 잘 수행되지 않을 수 있습니다.

+4

좋은 대답; '(! s.contains (_))'는 다소 짧습니다. –

+0

@Derek Wyatt. 좋은 지적. 아마도 나는 필터링이 매번 같을 것이므로 항목을 제외하는 두 번째 맵을 고려해야합니다. –

+0

@ 브루스 퍼거슨. 내가 한 말을 소금 한알로 가져 가라. 조숙 한 최적화는 많은 악의 뿌리입니다. –

4
map.withFilter{tuple => !list.contains(tuple._1)}.foreach{whatever} 

for(tuple <- map if !list.contains(tuple._1)) whatever 
+0

이것은 질문에 대한 답변입니다. – kap

4

이 질문은 asked and answered before을하고있다 :

Set[A] 함수 A => Boolean이 사실을 사용하여, 당신은 할 수 있습니다 :

map filterKeys s 
+0

감사합니다. 제출하기 전에 보았지만 이것을 보지 못했습니다. 건배, 브루스 –

+1

목록이 아니라 집합이고 목록에없는 사람들이 필터링하려고한다는 점만 제외하면 –

관련 문제