2012-12-02 21 views
2

在這裏嘗試對以下內容進行多重排序時有點瘋狂。地圖組通過多種排序

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

事情出差錯時,我GROUPBY博弈日期(顯示每個比賽日的比賽日期頭)和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)

我試圖徒勞的各種組合:

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

不管我做什麼,在Iterable[List[WeeklyResults]],整個上午走在這

回答

0

仍然無序

理念大爲讚賞,我在我束手無策這是heinously不好,但不知道怎麼回事,來解決這個問題而不需要重建模型。

所以,我在半分類列表地圖(即排序的上游戲日期)傳遞給視圖:

@(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是List'd對,我排序第1遊戲結果編號(可以在第二天完成,相同的遊戲編號,每個團隊的不同遊戲結果/結果)。

這是有效的,但是如果原始數據庫查詢以期望的順序返回結果集,那會非常痛苦。花了大約3小時的時間,通過這個,有趣的,但是...我現在可用的一點點時間完全浪費。絕對會愛上一個組合,保存下來的收藏訂單。

如果某人有一個「真實」的解決方案與砍死一個我想出了,請不要附和......

2

我認爲關鍵的問題是,GROUPBY裏面你GROUPBY返回複雜類型(List上的Iterable)。

如果我使用'變平'來簡化該部分,事情變得更簡單。我用你的測試用例類

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

的簡單化下來的版本,然後使用下列內容:

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

排序就像你一樣(酷技巧與列表地圖,順便說一句):

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

然後次要排序只是:

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

我希望有所幫助。

+0

1,這是正確的可迭代[列表[T]]是在分選而言開溜。我需要測試你的解決方案,看它是否有效;-) – virtualeyes

+0

太糟糕了,不起作用,或者至少不是第一次嘗試。我想了Iterable [列表[T]根據groupby對遊戲結果的ID創建允許我通過比賽的結果列表(A,B)對映射。當我按照你的建議扁平化時,似乎配對消失了;結果發生匹配錯誤。 – virtualeyes