2013-03-21 79 views
1

我遵循Xtend教程和電影例子。在本教程的最後,你可以找到這個問題:Xtend「電影例子」最佳答案

@Test def void sumOfVotesOfTop2() { 
     val long sum = movies.sortBy[ -rating ].take(2).map[ numberOfVotes ].reduce[ a, b | a + b ] 
     assertEquals(47_229L, sum) 
    } 

首先,電影是由等級排序,那麼我們就兩個最好的。接下來,使用地圖功能將電影列表變成其numberOfVotes列表。現在我們有一個List,可以通過添加值將其縮減爲單個Long。

您也可以使用reduce而不是map並減少。你知不知道怎麼?

我的問題是:什麼是最後一個問題的最佳答案?

我找到了一種不使用map()擴展方法來計算相同「sum」值的方法,但對我來說似乎很糟糕。這是我的解決方案:

assertEquals(47229, this.movies.sortBy[ -rating ].take(2).reduce[m1, m2 | new Movie('', 0, 0.0, m1.numberOfVotes + m2.numberOfVotes,null)].numberOfVotes) 

有沒有更好的(和更清潔)的方式來做到這一點?

回答

2

你可以使用fold(R seed, (R,T)=>R function)代替reduce((T,T)=>T)

assertEquals(47229, 
    movies 
    .sortBy[rating] 
    .reverseView 
    .take(2) 
    .fold(0L) [ result, movie | result + movie.numberOfVotes ]) 

請注意,map((T)=>R)不執行任何急於計算,但對需求進行評估,所以性能不應該的問題爲使用地圖功能的解決方案。儘管如此,如果您需要爲結果類型與元素類型不同的一組值結果進行累加,那麼fold非常方便。

+1

我同意,但Xtend在教程中,問題3表示可以替換'map [numberOfVotes] .reduce [a,b | a + b]「,這是我不明白的。真的有可能有一個很好的方式來做到這一點? – Antwane 2013-03-21 10:37:53