我正在尝试使用TreeSet创建一个二进制搜索树。我知道,根据定义,一个集合不包含任何重复的条目。然而,我确信,如果我创建自己的比较器,我可以允许TreeSet接收重复的条目。我已经这么做了:
public class A3BSTree <E> implements Tree <E> {
private TreeSet<E> tree;
private LinkedList<E> arr1;
private MyComparator comp;
public A3BSTree(){
tree = new TreeSet<>(comp);
}
...
...
...
private class MyComparator implements Comparator<E> {
@SuppressWarnings("unchecked")
@Override
public int compare(E e1, E e2) {
if (((A3BSTree<E>.MyComparator) e1).compareTo(e2) < 0) {
return -1;
}
else if (e1.equals(e2)) {
return 0;
}
else {
return 1;
}
}
public int compareTo(E e) {
return this.compareTo(e);
}
}
}
我不想要答案,我只需要解释一下为什么TreeSet仍然不会接受重复项。我只需要被引导到正确的方向。问题可能是我不能用泛型创建Comparator吗?
java.util.TreeSet add()方法
java.util.TreeSet类使用add方法将元素添加到Set中。此方法不允许重复。它使用Javadoc中提到的equals()方法检测重复项。
公共布尔加法(E E)如果指定的元素尚未存在,则将其添加到此集合中。更正式地说,如果集合不包含元素e2,则将指定的元素e添加到该集合中,使得(e==null?e2==null:e.equals(e2))。如果该集合已经包含该元素,则调用保持集合不变并返回false。
当前比较器实现
根据Comparator实现,您希望equals方法能够识别重复项(可能您已经覆盖了它?)。
} else if (e1.equals(e2)) {
return 0;
}
如果是这样的话,我相信TreeSet的行为在基于equals()方法拒绝重复项方面是正确的。
另一方面,可能在这里使用Comparable方法而不是Comparator更好,因为这允许对象与其自己的实例进行比较(差异在这里解释)。