2016-08-04 11 views
1

外部述語に依存するリストをソートしたい。私は表現力豊かなScalaの代替案を探しています。私が思いついた2つの選択肢には夢中ではない。考える:私はそうのような簡潔なソート式書くことができるようにしたいソート用の部分関数の値

val lst = List(5,4,3,2,1) 
val needsSorting = false 

:私のリストを与えること

lst.sortBy(sortDecision) 

は昇順のいずれかでソート:

List(1,2,3,4,5) // if needSorting == true 

やで元の年代順

List(5,4,3,2,1) // if needSorting == false 

しかし私は私のsortDecision部分的な機能に埋め込まれるようにソートする方法についての決定をしたい。

オルタナティブ1:

val sortDecision: PartialFunction[Int,Int] = { 
    case x: Int if (needsSorting) => x 
    case _ => -1 
} 

オルタナティブ2:

val sortDecision: PartialFunction[Int,Int] = { 
    case x: Int => if (needsSorting) x else -1 
} 

が、両方のケースで、私はneedsSorting場合、いくつかの充填材を生産するために持っている!私は何を作ってみたことは二つの選択肢です(この場合は-1)、コンパイラが幸せになるようにします。これは悪臭コードです。誰かがもう少しエレガントな同じことを達成するための選択肢を提供することができますか?

+0

"コードの匂い"が何であるか正確にはわかりません。しかし、 '-1'があるのが気に入らなければ、' val NoSort = -1'という定数を使うことができます。 – gregghz

答えて

1

needsSorting == false私はそれがあなたの意図が完全に明確になる唯一の方法だと思うので、よりエレガントな方法はまったく分類しないことだと思います。

これを達成する別の方法はOrderingを提供することですが、Ordering内で決定したい場合は、ダミー値を比較するなどの方法で同様の処理を行う必要があります。

-1を返す理由がソートされていないのは、sortByが各Intを別の値に変換して比較するときにその値を使用するということです。したがって、あなたの例では、List(-1,-1,-1,-1,-1)をソートして元の値を戻すようなものです。スカラソートはstableなので、すべての要素が同じ順序になります。

+0

これでソートはいつも起こりますか?私は部分的な機能の中でソートを短絡できることを期待していました。私ができない場合は、はい、私は、並べ替えを行う前に述語をテストする必要があります。私は意図を持って行くと思う。ありがとう。 – bauhaus9

関連する問題