You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala技术求助:如何按数组第二个值对Seq[Array[(Int, Int)]]分组?

解决思路与代码实现

首先得明确你报错的核心原因:你的序列类型是Seq[Array[(Int, Int)]],每个元素都是Array[(Int,Int)]对象,而不是单个的(Int,Int)元组。当你调用.groupBy(_._2)时,Scala会试图给每个数组实例调用_2属性,但数组根本没有这个成员,所以直接抛出了错误。

结合你给出的示例序列和目标输出,我分两种常见场景给你解决方案:

场景1:你实际的序列是Seq[(Int, Int)](示例里的类型)

看起来你可能是把类型写错了——示例里的序列是直接由元组组成的,而非数组包裹的元组。这种情况下,按以下步骤处理即可:

  1. 按元组的第二个值分组;
  2. 对每个分组,提取所有元组的第一个值并转换为固定长度的元组;
  3. 把结果收集成目标序列。

代码实现:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:17:01