尝试对以下内容进行多重排序有点疯狂。
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/