Frage

Ich habe dieses Scala-Codesegment, das eine Reihenfolge definiert und auf ein TreeSet anwendet.Dieser Teil lässt sich gut kompilieren.

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)

An einer anderen Stelle im Code möchte ich das erste Element im Satz abrufen (und später weitere, wenn das erste nicht das liefert, was ich will, obwohl das normalerweise nicht nötig sein wird), basierend auf der zuvor festgelegten Reihenfolge angegeben.Ich dachte, das Folgende würde funktionieren, aber es wurde nicht kompiliert:

val firstAccount = accountSet.min

Der Fehler ist "could not find implicit value for parameter cmp: Ordering[Account]"

Wenn ich jedoch das Bestellobjekt erneut spezifiziere, wenn ich nach dem Minimum frage, wird Folgendes kompiliert:

val firstAccount = accountSet.min(acctOrdering)

Ich dachte, es hätte automatisch die Reihenfolge verwendet, die ich zum Zeitpunkt der Erstellung angegeben hatte, und beim Hinzufügen zum Satz inkrementell sortiert, sodass ich die Reihenfolge beim Aufruf nicht erneut angeben müsste min.

Was mache ich falsch?Muss ich irgendwo explizit eine implizite Funktion definieren?

War es hilfreich?

Lösung

Was passiert, ist, dass Sie davon ausgehen min Hängt von der Reihenfolge des Sets ab, ist aber nicht der Fall.Speziell, min Und max sind generische Methoden, die für praktisch jede Sammlung verfügbar sind und implizit sind Ordering Parameter.

Wenn Sie es jedoch versuchen firstKey Und lastKey, welche sind SortedSet-spezifische Methoden funktionieren, ohne dass implizite übergeben werden müssen.

Bearbeiten

Eine Frage, die Sie möglicherweise gestellt haben, ist, wie Sie sicherstellen können, dass Ihre Account Der Typ kann mit jeder Methode bestellt werden, die eine erwartet Ordering.Sie können dies tun, indem Sie eine implizite Definition einfügen Account's Objektbegleiter, etwa so:

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

Sobald Sie dies getan haben, müssen Sie die Bestellung nicht mehr explizit übergeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top