5

順序を定義して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

私は何が間違っているのですか?どこかで陰関数を明示的に定義する必要がありますか?

4

1 に答える 1

11

何が起こっているのかというと、あなたが想定しているminのはセットの順序に依存しているということですが、そうではありません。具体的には、minmaxはほとんどすべてのコレクションで使用できるジェネリックメソッドであり、暗黙のOrderingパラメーターを取ります。

ただし、特定のメソッドであるandを試してみるfirstKeylastKeySortedSet暗黙的に渡す必要がなく機能します。

編集

あなたが提起したかもしれない1つの質問は、あなたのAccountタイプがを期待する任意の方法で注文できることをどのように確認するかということですOrderingAccountこれを行うには、次のように、オブジェクトコンパニオン内に暗黙的な定義を配置します。

object Account {
  implicit val ord = new Ordering[Account] {
    def compare(ac1: Account, acc2: Account): Int = {
      // code to compare based on various criteria
    }
  }
}

これを行うと、順序を明示的に渡す必要がなくなります。

于 2011-03-27T22:17:17.983 に答える