Scala:在列表中的第一个元素上划分 listbuffer[List[String]]

Scala: Partition a listbuffer[List[String]] on first element in list

我有一个 ListBuffer[List[String]] 包含:

List(1,"a",1)
List(1,"b",2)
List(2,"b",1)
List(2,"c",2)
List(2,"d",3)
List(3,"e",1)
List(3,"f",2)      

我想根据第一个元素对 ListBuffer 进行分区,因此所有以 1 开头的列表都将与 2 分开,依此类推。

我现在拥有的:

var feed = new ListBuffer[List[String]]()
val numberOfFeeds=feed.map(a => a.head).distinct.length
for(i<-1 to numberOfFeeds) {
  val k = feed.partition(x => x.head.toInt==i)
  println(k+"\r\n--------------------------------\r\n")
}

val result: Iterable[Listbuffer[List[Any]]] = listbuffer.groupBy(_.head).values

在您的情况下,结果将包含 3 个列表缓冲区,每个列表缓冲区都具有相同的第一个元素。

或者,如果您想保留顺序:

val result = listbuffer.groupBy(_.head).toList.sortBy(_._1.asInstanceOf[Int]).map(_._2)

这里我们必须使用类型转换 asInstanceOf 因为带有元素的列表是类型 List[Any] 并且 sortBy 需要它找不到的 Ordering[Any] 的实例.它看起来很笨拙,所以我建议您使用元组或大小写 类 而不是 List[T] 如果您确切知道它们将包含多少个元素。

val l = ListBuffer(
  (1, "a", 1),
  (1, "b", 2),
  (2, "b", 1),
  (2, "c", 2),
  (2, "d", 3),
  (3, "e", 1),
  (3, "f", 2))

l.groupBy(_._1).toList.sortBy(_._1).map(_._2)