如何在TreeSet中使用自定义类?

时间:2011-09-14 12:17:59

标签: java treeset

如果我使用与此类似的Set

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

class node {

  private int x;
  private int y;

}

这是否可以接受,因为它是一个TreeSet,它还会对它进行排序吗?

4 个答案:

答案 0 :(得分:20)

如果没有实施Comparable<Node>,它将无法对其进行排序,在覆盖equals()hashCode()之前,它不适合设置操作。 (你没有 覆盖equalshashCode TreeSet才能正常工作,但这样做是有意义的。)

这样的事情:

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。)

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

代码与接受有关,没有任何问题。但是对于排序Node类必须实现类似的接口。