树集
TreeSet类与散列类似,树集是一个有序集合(sorted collection)。
可以以任意顺序将元素插入到集合中,遍历集合时,自动按照排序后的顺序呈现。
插入5个字符串,访问添加的元素
package treeSet;
import java.util.TreeSet;
public class TreeSetSortTest {
public static void main(String[] args) {
var sorter = new TreeSet<String>();
sorter.add("Bob");
sorter.add("Amy");
sorter.add("Carl");
sorter.add("Egg");
sorter.add("Dog");
sorter.forEach((e)->System.out.print(e+" "));
}
}
//结果:Amy Bob Carl Dog Egg
数据结构是红黑树(red-black tree)。参考《算法导论》
将元素添加到树中要比散列表中慢,但是查询重复元素相比,树会快很多,log2(n)次比较。
注释:使用树集,必须能够比较元素,元素必须实现Comparable接口或构造时必须提供一个Comparator。
创建两个数集,按照部件编号排序和按照定制比较器排序
Item.java
package treeSet;
import java.util.Objects;
public class Item implements Comparable<Item> {
private String desc;
private int partNo;
public Item(String desc, int partNo) {
this.desc = desc;
this.partNo = partNo;
}
@Override
public int compareTo(Item o) {
int diff = Integer.compare(partNo, o.partNo);
return diff!=0?diff:desc.compareTo(o.desc);
}
@Override
public int hashCode() {
return Objects.hash(desc,partNo);
}
@Override
public boolean equals(Object obj) {
if(this==obj) return true;
if(obj==null) return false;
if(getClass()!=obj.getClass()) return false;
var other = (Item)obj;
return Objects.equals(desc,other.desc)&&partNo==other.partNo;
}
@Override
public String toString() {
return "Item [desc=" + desc + ", partNo=" + partNo + "]";
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getPartNo() {
return partNo;
}
public void setPartNo(int partNo) {
this.partNo = partNo;
}
}
TreeSetTest.java
package treeSet;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
var parts = new TreeSet<Item>();
parts.add(new Item("Toaster",1234));
parts.add(new Item("Widget",4562));
parts.add(new Item("Modem",9912));
System.out.println(parts);
var sortByDesc = new TreeSet<Item>(Comparator.comparing(Item::getDesc));
sortByDesc.addAll(parts);
System.out.println(sortByDesc);
}
}
//[Item [desc=Toaster, partNo=1234], Item [desc=Widget, partNo=4562], Item [desc=Modem, partNo=9912]]
//[Item [desc=Modem, partNo=9912], Item [desc=Toaster, partNo=1234], Item [desc=Widget, partNo=4562]]
java.util.TreeSet 1.2
- TreeSet()
- TreeSet(Comparator comparator),构造一个空树集。
- TreeSet(Collection elements)
- TreeSet(SortedSet s),构造一个树集,并增加一个集合和有序集合的所有元素。
java.util.SortedSet 1.2
- Comparator comparator(),返回用于对元素进行排序的比较器,如果元素用Comparable接口的compareTo方法进行比较则返回null。
- E first()
- E last(),返回有序集合的最小元素或最大元素。
java.util.NavigableSet 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 pollLast(),删除并返回这个集中的最大元素和最小元素,这个集为空时返回null。
- Iterator descendingIterator(),返回一个按照递减顺序遍历集中元素的迭代器。