TreeSet 要写清楚返回 1、0、-1 的各种情况(泛型非 Integer )!
TreeSet 是一种集合,在加入元素时会自动进行排序。如果泛型是基础的 Integer,直接用就好了:
TreeSet<Integer> tree = new TreeSet<>();
如果非 Integer 的类,那就要写好比较器,告诉 TreeSet 如何比较了,一下是一个泛型为 Node(含位置 Loc 和内容 Text )的 TreeSet:
//传入Comparator接口对象
TreeSet<Node> tree = new TreeSet<>(new Comparator<Node>() {
//首先是根据Loc值排序
public int compare(Node n0, Node n1) {
if(n0.getLoc() > n1.getLoc())
return 1;
else if(n0.getLoc() < n1.getLoc())
return -1;
//如果Loc值相同,比较Text是否相同,相同的情况下返回0
return n0.getText().equals(n1.getText())?0:1;
}
});
返回 0 意味着两个元素相同。毕竟 TreeSet 是 Set ,不能有重复的元素。但如果要删除元素,TreeSet 是拿着一个 Node 对每个元素进行比较,找到相同的之后删掉,所以不返回 0 是没有办法删除元素的,同时 tree.contains(node) 这个方法一定是返回 false。
上面这段代码之前没有比较 text,想着只比较位置,没有返回 0 ,位置相同的情况返回了 1 。但今天发现无法删除元素,找了好久想到是没有返回 0 ,TreeSet 找不到元素。
纯属个人见解,如有不同看法欢迎沟通。