Scala:收集列表参数传递的hashmap中定义的值
假设我有以下变量:Scala:收集列表参数传递的hashmap中定义的值,scala,list,hashmap,Scala,List,Hashmap,假设我有以下变量: val m = HashMap( ("1", "one"), ("2", "two"), ("3", "three") ) val l = List("1", "2") 我想提取列表(“一”、“二”),它对应于地图中列表中每个键的值 这是我的解决方案,效果很好。不过,我还是想知道我是否在重新发明轮子,是否有一些惯用的解决方案来实现我的目标: class Mapper[T,V](val map: HashMap[T,V]) extends PartialFunction[T,
val m = HashMap( ("1", "one"), ("2", "two"), ("3", "three") )
val l = List("1", "2")
我想提取列表(“一”、“二”),它对应于地图中列表中每个键的值
这是我的解决方案,效果很好。不过,我还是想知道我是否在重新发明轮子,是否有一些惯用的解决方案来实现我的目标:
class Mapper[T,V](val map: HashMap[T,V]) extends PartialFunction[T, V]{
override def isDefinedAt(x: T): Boolean = map.contains(x)
override def apply(x: T): V = map.get(x) match {
case Some(v) => v
}
}
val collected = l collect (new Mapper(map) )
列表(“一”、“二”)
您可以这样做,这似乎有点简单:
val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
.flatMap(_.toList)
或者甚至是这个,用一个简单的例子来理解:
val res = for {
key <- l
value <- m.get(key)
} yield value
val res=for{
键您可以这样做,这似乎有点简单:
val res = l.map(m.get(_)) // List(Some("one"), Some("two"))
.flatMap(_.toList)
或者甚至是这个,用一个简单的例子来理解:
val res = for {
key <- l
value <- m.get(key)
} yield value
val res=for{
key我建议如下:
m.collect { case (k, v) if l.contains(k) => v }
注:
- 不保留
l
- 不处理
l
我建议如下:
m.collect { case (k, v) if l.contains(k) => v }
注:
- 不保留
l
- 不处理
l
是的,您正在重新发明轮子。您的代码相当于
l collect m
但是增加了一层间接寻址,它不会向HashMap添加任何内容(已经有了,只需扩展“线性超类型”列表即可)
或者,您也可以使用flatMap
,如下所示:
l flatMap m.get
隐式可以从
s构建,确保结果实际上是一个列表
是的,您正在重新发明轮子。您的代码相当于
l collect m
但是增加了一层间接寻址,它不会向HashMap添加任何内容(已经有了,只需扩展“线性超类型”列表即可)
或者,您也可以使用flatMap
,如下所示:
l flatMap m.get
隐式CanBuildFrom
s确保结果实际上是一个列表
,这会在任何具有重复元素的列表上给出完全错误的结果,例如在val l=List.fill(10)(“1”)上
。即使在没有重复元素的列表上,也不能保证保留顺序。你是对的。有必要在l中处理重复项,但它不会保留在l中定义的顺序。还要感谢你给出了非常好的答案。这在任何有重复元素的列表上都会给出完全错误的结果,例如在val l=list.fill上(10) (“1”)
。即使在没有重复元素的列表上,也不能保证保留顺序。你是对的。有必要在l中处理重复项,但它不会保留在l中定义的顺序。还要感谢你给出了非常好的答案。哦,太好了哦,太好了