7

如果我使用Set与此类似的:

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

class node {

  private int x;
  private int y;

}

这是可以接受的吗,既然它是一个 TreeSet,它也会对它进行排序吗?

4

4 回答 4

22

没有你实现它就无法对它进行排序,并且在你覆盖andComparable<Node>之前它不会真正适合设置操作。(您不必重写和for工作,但这样做是有意义的。equals()hashCode()equalshashCodeTreeSet

像这样的东西:

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

(请注意,按照惯例,类名应该是Node,而不是node。)

于 2011-09-14T12:20:22.117 回答
6

Node 需要实现一个 Comparable 或者你需要传递一个自定义的 Comparator 来比较两个 Node 对象。此外,任何基于哈希的集合都依赖于适当覆盖 equals() 和 hashcode() 方法的对象。

于 2011-09-14T12:20:22.837 回答
2

您必须指定 equals、hashCode 并实现 Comparable 接口

于 2011-09-14T12:20:42.030 回答
0

就验收而言,代码没有任何问题。但是对于排序Node类必须实现可比较的接口。

于 2011-09-14T12:22:25.837 回答