7 Stimmen

Wie kann ich eine benutzerdefinierte Klasse in einem TreeSet verwenden?

Wenn ich eine Set ähnlich wie hier:

Set<node> s=new TreeSet<node>();

class node {

  private int x;
  private int y;

}

Wäre dies akzeptabel, und da es ein TreeSet ist, würde es auch sortieren?

22voto

Jon Skeet Punkte 1325502

Es wird nicht in der Lage sein, das Problem ohne Ihre Hilfe zu lösen. Comparable<Node> und ist für Mengenoperationen erst dann wirklich geeignet, wenn Sie die equals() y hashCode() . (Sie müssen nicht haben zu überschreiben equals y hashCode para TreeSet zu arbeiten, aber es wäre sinnvoll, dies zu tun).

Etwa so:

final class Node implements Comparable<Node> {

  private final int x;
  private final int y;

  Node(int x, int y) {
    this.x = x;
    this.y = y;
  }

  @Override public boolean equals(Object other) {
    if (!(other instanceof Node)) {
      return false;
    }
    Node otherNode = (Node) other;
    return x == otherNode.x && y == otherNode.y;
  }

  @Override public int hashCode() {
    return x * 31 + y * 17; // For example...
  }

  @Override public int compareTo(Node other) {
    // As of Java 7, this can be replaced with
    // return x != other.x ? Integer.compare(x, other.x) 
    //     : Integer.compare(y, other.y);

    if (x < other.x || (x == other.x && y < other.y)) {
      return -1;
    }
    return x == other.x && y == other.y ? 0 : 1;
  }
}

(Beachten Sie, dass der Klassenname nach Konvention Node pas node .)

6voto

Scorpion Punkte 3910

Node muss ein Comparable implementieren oder Sie müssen einen eigenen Comparator übergeben, der zwei Node-Objekte vergleichen kann. Jede Hash-basierte Sammlung setzt außerdem voraus, dass das Objekt die Methoden equals() und hashcode() entsprechend überschreibt.

2voto

leifg Punkte 8264

Sie müssen equals und hashCode angeben und die Schnittstelle Comparable implementieren

0voto

Santosh Punkte 17441

Was die Akzeptanz des Codes betrifft, so gibt es nichts zu beanstanden. Aber für die Sortierung Node Klasse MUSS eine vergleichbare Schnittstelle implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X