2016-11-22 27 views
1
val s = Set("blue", "orange") 
val m = Map("product_orange_123" -> 1, "prodoct_blue_123" -> 2, "product_green_123" -> 5, "product_blue_887" -> 7) 

我想删除映射中不包含集合中任何值的任何密钥。删除不包含集合中任何值的密钥

预期输出:

("product_orange_123" -> 1, "prodoct_blue_123" -> 2, "product_blue_887" -> 7) 
+0

可以请您分享预期的输出。 – kapiltekwani

+1

你甚至可以编译'val m = Map(“product_orange_123”,“prodoct_blue_123”,“product_green_123”,“product_blue_887”)'?地图具有类型'Map [Key,Value]'。 – ipoteka

+0

@ipoteka修好了抱歉。 –

回答

5

嗯,我想你的意思地图

筛选键不包含集合中的任何值

m.filterKeys(key => s.exists(key.contains(_))) 

这会做

1

设置扩展功能1

收集在动作在动作

m.collect { case (k, v) if s(k.split("_")(1)) => k -> v } 

筛选

m.filterKeys(key => s(key.split("_")(1))) 

滤波器在动作

m.filter { case (k, _) => s(k.split("_")(1)) } 

说明

Set延伸Function1,并且set实例可以直接应用于一个密钥以检查它是否存在于该集合中。

scala> val s = Set("blue", "orange") 
s: scala.collection.immutable.Set[String] = Set(blue, orange) 

scala> s("blue") 
res0: Boolean = true 

scala> s("apple") 
res1: Boolean = false 

scala> val s = Set("blue", "orange") 
s: scala.collection.immutable.Set[String] = Set(blue, orange) 

scala> val m = Map("product_orange_123" -> 1, "prodoct_blue_123" -> 2, "product_green_123" -> 5, "product_blue_887" -> 7) 
m: scala.collection.immutable.Map[String,Int] = Map(product_orange_123 -> 1, prodoct_blue_123 -> 2, product_green_123 -> 5, product_blue_887 -> 7) 

scala> m.collect { case (k, v) if s(k.split("_")(1)) => k -> v } 
res2: scala.collection.immutable.Map[String,Int] = Map(product_orange_123 -> 1, prodoct_blue_123 -> 2, product_blue_887 -> 7) 

scala> m.filterKeys(key => s(key.split("_")(1))) 
res3: scala.collection.immutable.Map[String,Int] = Map(product_orange_123 -> 1, prodoct_blue_123 -> 2, product_blue_887 -> 7) 

scala> m.filter { case (k, _) => s(k.split("_")(1)) } 
res4: scala.collection.immutable.Map[String,Int] = Map(product_orange_123 -> 1, prodoct_blue_123 -> 2, product_blue_887 -> 7) 
+1

该解决方案比接受的答案更简单,更高效。这看起来大致是线性的,而接受的答案是近似二次的。 – Akavall