Scala技术求助:如何按数组第二个值对Seq[Array[(Int, Int)]]分组?
解决思路与代码实现
首先得明确你报错的核心原因:你的序列类型是Seq[Array[(Int, Int)]],每个元素都是Array[(Int,Int)]对象,而不是单个的(Int,Int)元组。当你调用.groupBy(_._2)时,Scala会试图给每个数组实例调用_2属性,但数组根本没有这个成员,所以直接抛出了错误。
结合你给出的示例序列和目标输出,我分两种常见场景给你解决方案:
场景1:你实际的序列是Seq[(Int, Int)](示例里的类型)
看起来你可能是把类型写错了——示例里的序列是直接由元组组成的,而非数组包裹的元组。这种情况下,按以下步骤处理即可:
- 按元组的第二个值分组;
- 对每个分组,提取所有元组的第一个值并转换为固定长度的元组;
- 把结果收集成目标序列。
代码实现:
val originalSeq = Seq((1,0),(2,0),(2,0),(1,1),(1,1),(2,1)) val result = originalSeq .groupBy(_._2) // 按元组第二个值分组,得到Map[Int, Seq[(Int, Int)]] .values // 取出所有分组的元素集合 .map(group => group.map(_._1).toTuple) // 提取每个元组的第一个值并转成元组 .toSeq // 输出:Seq((1,2,2), (1,1,2))
注意:
toTuple是Scala 2.13及以上版本才有的方法。如果你用的是旧版本,需要手动构造元组:.map(group => { val firstValues = group.map(_._1).toList (firstValues(0), firstValues(1), firstValues(2)) })
场景2:你的序列确实是Seq[Array[(Int, Int)]]
如果序列里的每个元素真的是包裹着元组的数组(比如每个数组里只有一个元组),那我们需要先把数组扁平化,将其转换成Seq[(Int, Int)],再按上面的逻辑处理:
代码实现:
val originalSeq = Seq(Array((1,0)), Array((2,0)), Array((2,0)), Array((1,1)), Array((1,1)), Array((2,1))) val result = originalSeq .flatMap(_.toSeq) // 扁平化数组,得到Seq[(Int, Int)] .groupBy(_._2) .values .map(group => group.map(_._1).toTuple) .toSeq // 同样得到目标输出:Seq((1,2,2), (1,1,2))
如果你的数组里包含多个元组,那需要明确你的分组逻辑——比如是按数组中所有元组的第二个值的共同值分组?还是按数组中第一个元组的第二个值分组?这种场景下你可以补充具体逻辑,再调整代码。
内容的提问来源于stack exchange,提问作者toubinaattori
相关产品推荐
相关产品推荐

