2

ここでは、次の点でマルチソートを試みて少し厄介になります。

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

ソートされていないマップが返されるので、ゲームの日付(ゲームの日ごとにゲームの日付ヘッダーを表示するため)とID(ホーム/アウェイチームのペアをグループ化するため)にgroupByを実行すると、問題が発生します;-)

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

さて、ListMapはソートされたマップを取得する1つの方法です。それを試してみましょう。ゲームの日付、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)を返すことだと思います。

'flatten'を使用してその部分を単純化すると、物事ははるかに単純になります。私はあなたのケースクラスのダムダウンバージョンを使用しました

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
    ...
  }
}

基本的に、各 gameresult はリスト化されたペアであるため、ペアの最初のゲーム結果 ID で並べ替えます (2 番目でも同様に、同じゲーム ID、チームごとに異なるゲーム結果/結果)。

これは機能しますが、元のデータベース クエリが結果セットを目的の順序で返すことを考えると、非常に苦痛です。これをハッシュするのに約 3 時間を費やしました。興味深いですが、現在利用できるわずかな時間を無駄にしています。コレクションの順序を保持する groupBy を絶対に気に入るはずです。

誰かが「本当の」解決策と私が思いついたハッキン​​グされた解決策を持っている場合は、チャイムしてください...

于 2012-12-02T16:48:09.607 に答える