scala - 映射 groupBy 与多排序

标签 scala dictionary group-by sorting

尝试对以下内容进行多重排序有点疯狂。

case class WeeklyResults(
  schedule: Schedule,
  result: GameResult
)
val games = // returns correctly sorted List of WeeklyResults
  repo.gameresult.findAllByDate(date)

当我在比赛日期(显示每个比赛日的比赛日期标题)和 id(对主/客队对进行分组)上进行 groupBy 时,事情会出错,因为返回了未排序的 map ,很有趣;-)

val unsorted = // Map[JodaTime, Iterable[List[WeeklyResults]]]
  games.groupBy(_.schedule.gameDate).mapValues(_.groupBy(_.schedule.id).values)

好吧,ListMap 是获取排序 map 的一种方法,让我们尝试一下,以毫秒为单位对游戏日期 JodaTime 进行排序。

val sorted =
  ListMap(unsorted.toList.sortBy(_._1.getMillis):_*)

一切都好,游戏按照正确的顺序在游戏日期标题下排序...但是,每个游戏日内的游戏是随机排序的;-(

所以,问题是,我到底如何才能按游戏日期和游戏结果 ID 排序? (其中id是游戏结果表的PK,实际上是数据库级别的排序顺序)

我尝试了各种徒劳的组合:

unsorted.flatMap{x=>
  ListMap(
    Seq( (x._1, x._2.map(_._2.sortBy(_.result.id))) ).sortBy(_.1.getMillis)
  :_*)
}

无论我做什么,Iterable[List[WeeklyResults]] 仍然未排序

非常感谢的想法,我束手无策,整个早上都花在这个上了

最佳答案

我认为关键问题是 groupBy 内的 groupBy 返回一个复杂类型(Iterable over List)。

如果我使用“展平”来简化该部分,事情就会变得简单得多。我使用了您的案例类的简化版本

case class WeeklyResults(
  schedule: DateTime,
  id: Int
)

然后使用以下内容:

val unsorted = // Map[JodaTime, List[WeeklyResults]]
    games.groupBy(_.schedule).mapValues(_.groupBy(_.id).values.flatten.toList)

像你一样排序(顺便说一下,ListMap 的酷技巧):

val sorted = //ListMap[DateTime, List[WeeklyResults] ]
    ListMap(unsorted.toList.sortBy(_._1.getMillis):_*)

然后二次排序就是:

val reallySorted = sorted.mapValues( v => v.sortBy( _.id) )

希望对您有所帮助。

关于scala - 映射 groupBy 与多排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670547/

相关文章:

c++ - std map 和 multimap 迭代器是一样的吗?

MySQL - 每种类型值的总计

sockets - 如何控制Scala远程actor的TCP_NODELAY设置?

Scala 特化用于基本类型的数值运算

c# - 如何根据类中属性的类型动态创建 C# 泛型字典?

mysql根据客户端的日期组选择第一条记录

mysql - 按年,月和2个日期字段条件分组

Scalaz 管道运算符与列表方法连接

scala - 带有几列的 scala slick 中的动态排序

python - 在 Python 中创建包含列表列表的字典