如何连接作为map值的列表?

时间:2014-12-26 19:50:47

标签: scala collections containers scala-collections scala-java-interop

假设:

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

4 个答案:

答案 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

为什么这么复杂?

  • Put是Java类型来表示“写入”操作内容,我们只能通过单元格系列元素列表来获取其单元格。当然它们都是Java。
  • 我只能访问接口(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