一.特性
TreeSet集与散列集 十分类似,不过,它比散列集有所改进。TreeSet是一个有序集合。可以以任意顺序将元素插入到集合中。在对集合进行遍历时,每个值将自动地按照排序后的顺序呈现。 如,插入3个字符串,然后访问添加的所有元素。
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> sorter = new TreeSet<>();
sorter.add("Bob");
sorter.add("Amy");
sorter.add("Carl");
for (String str : sorter) {
System.out.println(str);
}
}
}
正如TreeSet类名所示,排序是用树结构完成的(当前实现使用的是红黑树)。每次将一个元素添加到树中时,都被放置在正确的排序位置上。因此迭代器总是以排好序的顺序访问每个元素。因此,将一个元素添加到树中要比添加到散列表中慢。 如果不需要对数据进行排序,就没有必要付出排序的开销。更重要的是,对于某些数据来说,对其排序要比散列函数更加困难。散列函数只是将对象适当地打乱存放,而此比较却要精确地判别每个对象。 要使用树集,必须能够比较元素。这些元素必须实现Comparable
接口。
二.实例
自定义Item
类,重写了toString
,equals
,hashCode
,compareTo
方法。其中toString
,equals
,hashCode
可以使用IDE工具生成。
public class Item implements Comparable<Item>
{
private String description;
private int partNumber;
public Item(String aDescription, int aPartNumber)
{
description = aDescription;
partNumber = aPartNumber;
}
public String getDescription()
{
return description;
}
//重写toString方法
public String toString()
{
return "[description=" + description + ", partNumber=" + partNumber + "]";
}
//重写equals方法
public boolean equals(Object otherObject)
{
if (this == otherObject) return true;
if (otherObject == null) return false;
if (getClass() != otherObject.getClass()) return false;
Item other = (Item) otherObject;
return Objects.equals(description, other.description) && partNumber == other.partNumber;
}
public int hashCode()
{
return Objects.hash(description, partNumber);
}
//重写compareTo接口
public int compareTo(Item other)
{
//首先比较partNumber
int diff = Integer.compare(partNumber, other.partNumber);
//如果partNumber相等,再比较descriptioin
return diff != 0 ? diff : description.compareTo(other.description);
}
}
public class TreeSetTest
{
public static void main(String[] args)
{
SortedSet<Item> parts = new TreeSet<>();
parts.add(new Item("Toaster", 1234));
parts.add(new Item("Widget", 4562));
parts.add(new Item("Modem", 9912));
System.out.println(parts);
NavigableSet<Item> sortByDescription = new TreeSet<>(
Comparator.comparing(Item::getDescription));
sortByDescription.addAll(parts);
System.out.println(sortByDescription);
}
}
三.Set集合下的常用类
SortedSet
中的元素无序不可重复,但是存进去的元素可以按照元素大小顺序自动排序。
//返回用于对元素进行排序的比较器。如果元素用Comaparable接口的compareTo方进行比较则返回null
Comparator<? super E> comparator()
//返回有序集中的最小元素
E first()
//返回有序集中的最大元素
E last()
NavigableSet
扩展了 SortedSet
,具有了为给定搜索目标报告最接近匹配项的导航方法。
//返回大于value的最小元素,如果没有这样的元素则返回null
E higher(E value)
//返回大于value的最大元素,如果没有这样的元素则返回null
E lower(E value)
//返回大于等于value的最小元素,如果没有这样的元素则返回null
E ceiling(E value)
//返回小于等于value的最大元素,如果没有这样的元素则返回null
E floor(E value)
//删除并返回这个集中的最大元素,这个集为空时返回null
E pollFirst()
//删除并返回这个集中的最小元素,这个集为空时返回null
E pollLast()
//返回一个按照递减顺序遍历集中元素的迭代器
Iterator<E> descendingIterator()