这段代码来自Scala工作表:
case class E(a: Int, b: String)
val l = List(
E(1, "One"),
E(1, "Another One"),
E(2, "Two"),
E(2, "Another Two"),
E(3, "Three")
)
l.groupBy(x => x.a)
// res11: scala.collection.immutable.Map[Int,List[com.dci.ScratchPatch.E]] =
// Map(
// 2 -> List(E(2,Two), E(2,Another Two)),
// 1 -> List(E(1,One), E(1,Another One)),
// 3 -> List(E(3,Three))
// )
您将注意到,groupBy返回一个映射,但是元素的排序现在与以前不同。你知道为什么会发生这种情况吗,避免这种情况的最好方法是什么?
发布于 2013-07-17 01:45:24
在处理数据库记录时,我总是遇到这种情况。数据库按某个键对它们进行排序,但随后groupBy将其撤消!因此,我已经开始用一个按连续相等的键进行分组的函数来拉皮条Sequence类:
class PimpedSeq[A](s: Seq[A]) {
/**
* Group elements of the sequence that have consecutive keys that are equal.
*
* Use case:
* val lst = SQL("SELECT * FROM a LEFT JOIN b ORDER BY a.key")
* val grp = lst.groupConsecutiveKeys(a.getKey)
*/
def groupConsecutiveKeys[K](f: (A) => K): Seq[(K, List[A])] = {
this.s.foldRight(List[(K, List[A])]())((item: A, res: List[(K, List[A])]) =>
res match {
case Nil => List((f(item), List(item)))
case (k, kLst) :: tail if k == f(item) => (k, item :: kLst) :: tail
case _ => (f(item), List(item)) :: res
})
}
}
object PimpedSeq {
implicit def seq2PimpedSeq[A](s: Seq[A]) = new PimpedSeq(s)
}
要使用它:
import util.PimpedSeq._ // implicit conversion
val dbRecords = db.getTheRecordsOrderedBy
val groups = dbRecords.groupConsecutiveKeys(r => r.getKey)
https://stackoverflow.com/questions/14434160
复制相似问题