2

这里有点疯狂,试图对以下内容进行多重排序。

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

当我在比赛日期分组(以显示每个比赛日的比赛日期标题)和 id(将主/客队对分组)作为未排序的地图返回时,事情出错了,有趣 ;-)

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

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

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

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

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

我尝试了各种无效的组合:

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

不管我做什么,Iterable[List[WeeklyResults]]剩下的未分类

非常感谢您的想法,我束手无策,整个上午就这样过去了

4

2 回答 2

2

我认为关键问题是 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) )

我希望这会有所帮助。

于 2012-12-02T20:38:45.570 回答
0

这是非常糟糕的,但不确定如何在不重构模型的情况下解决问题。

因此,我将半排序的 ListMap(即按游戏日期排序)传递给视图:

@(model: Map[org.joda.time.DateTime, Iterable[List[ushr.model.WeeklyResults]]])

@model.map{ case(date,games) =>
  // display game date headers
  ...

  // the ugliness ensues
  @games.toSeq.map(x=>x).sortBy(_(0).result.id).map{ case(List(a,b))=>
    // display game results on this particular game date
    ...
  }
}

基本上,由于每个游戏结果都是一个 List'd 对,我对这对中的第一个游戏结果 ID 进行排序(也可以在第 2 个进行排序,相同的游戏 ID,每个团队的不同游戏结果/结果)。

这可行,但考虑到原始数据库查询以所需顺序返回结果集,这确实很痛苦。花了大约 3 个小时来解决这个问题,这很有趣,但是……完全浪费了我现在可用的一点时间。绝对会喜欢一组按保存的收藏顺序。

如果有人有一个“真正的”解决方案与我想出的黑客解决方案相比,请插话......

于 2012-12-02T16:48:09.607 回答