Scala:在列表

时间:2017-07-13 18:55:11

标签: scala collections partitioning

我的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")
}

1 个答案:

答案 0 :(得分:1)

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)