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)
我有一个 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)