Как назначить заказ на TreeSet в Scala без повторения - PullRequest
4 голосов
/ 28 марта 2011

У меня есть этот сегмент кода Scala, который определяет порядок и применяет его к TreeSet. Эта часть прекрасно компилируется.

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.

Что я делаю не так? Нужно ли где-то явно определять неявную функцию?

1 Ответ

10 голосов
/ 28 марта 2011

Что происходит, вы предполагаете, что min зависит от порядка набора, но это не так.В частности, min и max являются общими методами, доступными практически для любой коллекции, и они принимают неявный параметр Ordering.

Однако, если вы попробуете firstKey и lastKey, которыеSortedSet -специфичные методы, они будут работать без передачи каких-либо неявных.

Редактировать

Один вопрос, который вы могли бы задать, заключается в том, как убедиться, чтоВаш тип 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
    }
  }
}

Как только вы это сделаете, вам не нужно будет явно передавать порядок.

...