時間:
私は長さの降順で文字列のコレクションをソートするコードのこの作品に出会いました:
words.sortBy(x => -x.length)
誰かの助け私はの目的を理解することができます-
の前ではx
あるし、作品によって、このコードの一部を分解しますか?それは「逆」の操作のために立っていますか?私はそれの整数演算を知っているが、アルゴリズムは、バックグラウンドでどのように動作するか私が考え出す苦労しています。また、これはバブルソートを考えることができますか?
マシューKubuszok:
あなたが持っている場合:
val collection: SomeCollection[A]
val keyToSortBy A => B
ときに実行します。
collection.sortBy(keyToSortBy)
何が起こるかはScalaは探しますということですOrdering[B]
(あなたがまだそれらに精通していない場合は暗黙について読む)その暗黙の範囲で、そしてそれは、アルゴリズムをソートしてelemetnsを比較するには、このinterrfaceが提供するメソッドを使用します。
sortBy
使用されますOrdering[X]
(と思うの昇順で物事を並べ替えるためにComparator
は、Javaを知っていれば)。以下の場合Ordering[Int]
のために、それはちょうど、整数の昇順だOrdering[String]
あなたはの字句順序を持っていますStrings
。
何が-
ここでソートアルゴリズムに渡す前に値を取っているんInt
し、それを否定します。あなたには、いくつかの例を見ればそれは容易になるだろう。
List("a", "bb", "ccc").sortBy(word => word.length)
// imagine that what it does is:
// - building a collection of pairs ("a", 1), ("bb", 2), ("ccc", 3)
// ( (value from collection, what function returned for that value) )
// - sorting by the second element of pair
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("a", 1), ("bb", 2), ("ccc", 3)
List("a", "bb", "ccc") // result
我々は置けば-
そこに、何がOrdering
違うだろうcompateになるだろう:
List("a", "bb", "ccc").sortBy(word => -word.length)
// - building a collection of pairs ("a", -1), ("bb", -2), ("ccc", -3)
// - sorting by the second element of pair - notice that all are negative now!!!
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("ccc", -3), ("bb", -2), ("a", -1)
List("ccc", "bb", "a") // result