1

Xtend のチュートリアルと映画の例に従いました。このチュートリアルの最後に、次の質問があります。

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

最初に映画を評価順に並べ替え、次に最高の 2 つを選びます。次に、マップ関数を使用して、映画のリストを numberOfVotes のリストに変換します。これで、値を追加することで単一の Long に縮小できる List ができました。

map と reduce の代わりに reduce を使用することもできます。どのようにするか知っていますか?

私の質問は次のとおりです。最後の質問に対する最良の答えは何ですか?

map() 拡張メソッドを使用せずに同じ「合計」値を計算する方法を見つけましたが、私にはひどいようです。これが私の解決策です:

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

それを行うためのより良い(そしてよりクリーンな)方法はありますか?

4

1 に答える 1

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結果の型が要素の型とは異なる一連の値の結果を蓄積する必要がある場合は、非常に便利です。

于 2013-03-21T10:16:00.377 に答える