首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Scala中的groupBy改变了列表项的顺序?

为什么Scala中的groupBy改变了列表项的顺序?
EN

Stack Overflow用户
提问于 2013-01-21 15:31:37
回答 1查看 8.3K关注 0票数 22

这段代码来自Scala工作表:

代码语言:javascript
复制
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返回一个映射,但是元素的排序现在与以前不同。你知道为什么会发生这种情况吗,避免这种情况的最好方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2013-07-17 01:45:24

在处理数据库记录时,我总是遇到这种情况。数据库按某个键对它们进行排序,但随后groupBy将其撤消!因此,我已经开始用一个按连续相等的键进行分组的函数来拉皮条Sequence类:

代码语言:javascript
复制
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)
}

要使用它:

代码语言:javascript
复制
import util.PimpedSeq._   // implicit conversion    
val dbRecords = db.getTheRecordsOrderedBy
val groups = dbRecords.groupConsecutiveKeys(r => r.getKey)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14434160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档