0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java集合——树集(TreeSet)+对象的比较 的相关知识;
0.2) for full source code, please visit https://github.com/pacosonTang/core-java-volume/blob/master/chapter13/TreeSetTest.java
0.3) for java.lang.Comparable 和 java.util.Comparator 的区别和联系:
http://blog.csdn.net/pacosonswjtu/article/details/50320775 + http://blog.csdn.net/pacosonswjtu/article/details/50320887
1.1)树集是一个有序集合。可以以任意顺序将元素插入到集合中, 在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现;
SortedSet<String> sorter = new TreeSet<>(); // TreeSet implements SortedSet
sorter.add("bob");
sorter.add("car");
sorter.add("amy");
for(String s: sorter)
System.println(s);
1.1.2)将元素添加到 树(TreeSet)中要比添加到散列表(HashSet)中慢, 但是,与将元素添加到数组或链表的正确位置上相比还是快很多的;
Attention) TreeSet 的排序功能用到了红黑树, 因此迭代器总是以排好序的顺序访问每个元素)
API java.util.TreeSet<E> 1.2
TreeSet():构造一个空树集;
TreeSet(Collection extends E> elements):构造一个树集, 并将集合中所有元素添加到树集中;
2.1) TreeSet如何知道希望元素怎样排列呢? 在默认情况下, 树集假定插入的元素实现了 Comparable 接口, 这个接口定义了一个方法:
public interface Comparable
{
in compareTo(T other);
}
2.2)如果要插入自定义对象, 就必须通过实现 Comparable接口自定义排列顺序。
class Item implements Comparable<Item>
{
public int compareTo(Item other)
{
return partNumber - other.partNumber;
}
}
2.3)出现的问题+解决方法
public interface Comparator
{
int compare(T a, T b);
}
class ItemComparator implements Comparator<Item>
{
public int compare(Item a, Item b)
{
String desrcA = a.getDescription();
String desrcB = b.getDescription();
String desrcA.compareTo(desrcB);
}
}
ItemComparator comp = new ItemComparator();
SortedSort- sort = new TreeSet<>(comp);
Attention)
SortedSet<Item> set = new TreeSet<>(new
Comparable<Item>(){ //匿名 内部类;
public int compare(Item a, Item b) // 匿名内部类中的方法;
{
String desrcA = a.getDescription();
String desrcB = b.getDescription();
String desrcA.compareTo(desrcB);
}
});
Annotation)
2.4)下面的图是否给了我们的疑虑:是否总应该用 树集(TreeSet)取代散列集(HashSet)?
2.5)收集矩形集(just for coarse understanding):想具体了解树集和散列集间的差异, 还需要研究一个收集矩形集的任务。如果使用 TreeSet, 就需要提供 Comparator;
Annotation) 从 Java SE 6 开始, TreeSet 类实现了 NavigableSet 接口。 这个接口增加了几个便于定位元素以及反向遍历的方法;
2.6)看个荔枝:(下面的程序创建了两个 Item 对象的树集, 第一个按照部件编号排序, 这是Item对象的默认顺序。第二个通过使用一个定制的比较器来按照描述信息排序-)
Complementary)我们给出 Integer 源码 的 Comparatable 实现:
java.lang.Comparable 1.2
int compareTo(T other) :将this 和 other 进行比较, 返回 正值、负值和0;
java.util.Comparator 1.2
int compare(T a, T b): 将a 和 b进行比较, 返回 正值、负值和0;
java.util.SortedSet 1.2
Comparator super E> comparator() :返回用于对元素进行排序的比较器, 如果元素用 Comparable 接口的compareTo 方法比较则返回 null;
E first();
E last();
返回有序集中的最小最大元素;
java.util.NavigableSet<E> 6
E higher(E value)
E lower(E value)
返回大于 value 的最小元素或小于 value 的最大元素,否则返回 null;
E ceiling(E value)
E floor(E value)
返回大于等于 value 的最小元素或小于等于 value 的最大元素,否则返回 null;
E pollFirst(E value)
E pollLast(E value)
删除并返回这个集中的最大元素或最小元素, 这个集为空时返回 null;
Iterator<E> descendingIterator():返回一个按照 递减顺序遍历集合中元素的迭代器;
java.util.TreeSet<E> 1.2
TreeSet() :构造一个用于 排列 Comparable 对象的树集;
TreeSet(Comparator super E > c ):构造一个树集, 并使用指定的比较器对其中的元素进行排序;
TreeSet(SortedSet extends E> elements):构造一个树集, 将有序集中的所有元素添加到这个树集中, 并使用与给定集合相同的元素比较器;