質問

注文を定義し、それを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を想定していることです。具体的には、minmaxは、ほとんど任意のコレクションで利用可能な一般的なメソッドであり、暗黙のOrderingパラメータを取ります。

しかし、firstKey固有のメソッドであるlastKeySortedSetを試してください。

編集

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
    }
  }
}
.

それをすると、注文を明示的に渡す必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top