def sort(s:String)={
val a= s.toCharArray ()
scala.util.Sorting.quickSort(array)
new String(a)
}
- QuickSort への呼び出しを維持しながら、上記をより簡潔に記述する方法はありますか?
- クイックソートが新しい配列を返すのではなく、その場で配列を変更するのはなぜですか (関数型言語が行うべきことではありませんか?)
def sort(s:String)={
val a= s.toCharArray ()
scala.util.Sorting.quickSort(array)
new String(a)
}
並べ替え方法に問題はありません。インプレース クイックソートが必要な場合は、おそらくこれが最適です。
Scala は純粋な関数型言語ではありません。関数型スタイルを使いやすいものにしようとしていますが、パフォーマンスやその他の理由で命令型スタイルを使用したい場合は、何も問題はありません。実際、関数型スタイルが可能であることに加えて、scala は Java よりもはるかに優れた OO 言語でもあります。
変更可能な状態をいつ使用するかについて、言語の作成者である Martin Odersky の講演をご覧ください。 ScalaDays 2013 基調講演
いずれにせよ、変更可能な状態がメソッドのローカル変数に限定されている限り、それは無害であり、簡単に推論できます。sort メソッドは、内部で変更可能な状態を使用していても、外部からは純粋/参照透過的です。
ところで、文字列に対して機能する不変の変換バージョンの sort が必要な場合は、それも存在します。内部で sort メソッドと同様のことを行う可能性があります。
scala> "BCAD".sorted
res5: String = ABCD