Фильтрация ключей во время итерации по карте - PullRequest
4 голосов
/ 28 февраля 2012

Какой лучший способ перебрать карту и отфильтровать определенные ключи? Псевдокод может быть что-то вроде

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

Спасибо Bruce

Ответы [ 3 ]

10 голосов
/ 28 февраля 2012
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)

Но, если это огромная карта и огромный набор, то я бы посоветовал сначала отсортировать их и выполнить взаимную итерацию по ним, отбирая нужные вам фрагменты по ходу работы.Повторные вызовы на contains могут работать не так, как вам хотелось бы, особенно если вы используете List вместо Set.

4 голосов
/ 29 февраля 2012

Этот вопрос был задан и получен ранее :

Используя тот факт, что Set[A] является функцией A => Boolean, вы можете просто сделать:

map filterKeys s
4 голосов
/ 28 февраля 2012
map.withFilter{tuple => !list.contains(tuple._1)}.foreach{whatever}

Эквивалентное

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