自分自身を繰り返さずにScalaのTreeetの注文を割り当てる方法
-
12-11-2019 - |
質問
注文を定義し、それをTreesetに適用するScalaコードのセグメントを持っています。この部分は罰金をまとめた。
val acctOrdering = new Ordering[Account] {
def compare(acc1: Account, acc2: Account) {
// code to compare based on various criteria
}
}
private var accountSet = new TreeSet[Account]()(acctOrdering)
.
コード内の他の場所では、セット内の最初の要素を取得したい(そして最初のものが私が欲しいものを生み出していない場合は後続のものを取得しますが、通常は必要ありません)。私が以前に指定した順序。私は次のように機能すると思いましたが、それはコンパイルされませんでした:
val firstAccount = accountSet.min
.
エラーは"could not find implicit value for parameter cmp: Ordering[Account]"
です。
しかし、最小限に依頼したときにもう一度注文オブジェクトを指定した場合、コンパイル:
val firstAccount = accountSet.min(acctOrdering)
.
私は建設時に私が与えた順序を自動的に使用し、私がセットに追加されたときに並取りするので、min
を呼び出すときにもう一度順序付けする必要はないと思いました。
私は何をしていますか?私は暗黙的な関数をどこかに明示的に定義する必要がありますか?
解決
起動中のものは、min
を想定していることです。具体的には、min
とmax
は、ほとんど任意のコレクションで利用可能な一般的なメソッドであり、暗黙のOrdering
パラメータを取ります。
しかし、firstKey
固有のメソッドであるlastKey
とSortedSet
を試してください。
編集
1つの質問があるかもしれないと、Account
の種類がOrdering
を期待している方法で順序付けできることを確認する方法です。このように、Account
のオブジェクトコンパニオン内に暗黙の定義を入れることでそれを行うことができます。
.
object Account {
implicit val ord = new Ordering[Account] {
def compare(ac1: Account, acc2: Account): Int = {
// code to compare based on various criteria
}
}
}
それをすると、注文を明示的に渡す必要はありません。