1. ホーム
  2. scala

[解決済み] scalaでinverse sortするのに最適な方法は?

2022-04-28 08:01:53

質問

scalaで逆ソートをするのに最適な方法は何ですか? 以下はやや遅いのではないかと想像しています。

list.sortBy(_.size).reverse

sortBy を使って逆順に並べ替える便利な方法はないでしょうか? 私はむしろ sortWith .

解決方法は?

数値でソートする場合、符号を変更する方法があります。

list.sortBy(- _.size)

より一般的には、ソートは暗黙の秩序を持つメソッド sorted で行われるかもしれませんが、これは明示的にすることもできますし、秩序は逆を持ちます (下記のリストの逆ではありません) を行うことができます。

list.sorted(theOrdering.reverse)

反転させたい順序が暗黙の順序であれば、implicitly[Ordering[A]]で取得することができます。(Aは順序付けしている型) または better Ordering[A] です。ということになります。

list.sorted(Ordering[TheType].reverse)

sortBy は Ordering.by を使っているようなものなので

list.sorted(Ordering.by(_.size).reverse)

多分、(マイナスに比べて)最短で書くことはできないが、意図は明確である。

更新情報

最後の行がうまくいきません。を受け入れるには _Ordering.by(_.size) をタイプするために、コンパイラはどのタイプで注文しているかを知る必要があります。 _ . それはリストの要素の型であるように思えますが、そうではありません。 def sorted[B >: A](ordering: Ordering[B]) . 順序は A の任意の祖先にも適用されます。 A (を使用することができます。 byHashCode : Ordering[Any] = Ordering.by(_.hashCode) ). そして実際、listが共変であることから、この署名が強制されます。 次のようなことができる。

list.sorted(Ordering.by((_: TheType).size).reverse)

が、これはもっと気持ち悪い。