假设:
scala> var a = Map.empty[String, List[Int]]
a: scala.collection.immutable.Map[String,List[Int]] = Map()
scala> a += ("AAA" -> List[Int](1,3,4))
scala> a += ("BBB" -> List[Int](4,1,4))
scala> a
res0: scala.collection.immutable.Map[String,List[Int]] = Map(AAA -> List(1, 3, 4), BBB -> List(4, 1, 4))
如何将值连接到单个可迭代集合(待排序)?
List(1, 3, 4, 4, 1, 4)
我应该如何结束此代码?
a.values.[???].sorted
答案 0 :(得分:8)
你应该结束:
a.values.flatten
结果:
scala> Map("AAA" -> List(1, 3, 4), "BBB" -> List(4, 1, 4))
res50: scala.collection.immutable.Map[String,List[Int]] = Map(AAA -> List(1, 3, 4), BBB -> List(4, 1, 4))
scala> res50.values.flatten
res51: Iterable[Int] = List(1, 3, 4, 4, 1, 4)
更新:
针对您的具体情况:
(for(vs <- a.asScala.values; v <- vs.asScala) yield v.asInstanceOf[TargetType]).sorted
答案 1 :(得分:7)
这将有效
a.values.flatten
//> res0: Iterable[Int] = List(1, 3, 4, 4, 1, 4)
答案 2 :(得分:5)
考虑
a.flatMap(_._2)
使每个元组的第二个元素变平(地图中的每个值)。
在这种情况下的等效也是
a.values.flatMap(identity)
答案 3 :(得分:1)
我对所收到的所有答案表示赞赏。最后,好点导致了真正有效的代码。下面是真正的代码片段,x
这里是org.apache.hadoop.hbase.client.Put
,这使得所有“细节中的恶魔”。我需要将HBase Put
转换为适当的数据单元列表(可通过org.apache.hadoop.hbase.Cell
接口访问),但我需要披露它们确实实现为KeyValue
的事实({{ 1}})。
org.apache.hadoop.hbase.KeyValue
为什么这么复杂?
val a : Put ...
a.getFamilyCellMap.asScala
.flatMap(
_._2.asScala.flatMap(
x => List[KeyValue](x.asInstanceOf[KeyValue]) )
).toList.sorted
),但我需要实现(Cell
),因此需要进行预测。我保证不存在任何其他内容。在所有这些之后最有趣的事情我决定放弃标准KeyValue
并在早期阶段将数据封装到不同的容器(这是我的自定义类)中,这使事情变得更加简单。
对于这种情况更通用的答案,其中a为Put
,其值为java.util.Map[?]
,列表元素为java.util.List[?]
,但您需要`TargetType可能是:
BaseType