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