1、TreeSet类
是SortedSet接口的实现类。可以确保集合中的元素保持有序状态。根据红黑树的存储方式来存储集合元素,中间用到的比较可以通过两种方式实现:
待存入集合的对象元素继承重写Comparable接口中的comparator()方法完成,
继承重写Comparator接口中的compare()方法,然后将Comparator接口实现类的对象传给TreeSet的构造函数,建立TreeSet集合。
这里的比较不是通过equals方法。我们比较对象时一般使用equals方法,因此应该另equals方法的结果和TreeSet使用的比较方法的结果一致,避免存入相同的元素或不同的元素(equals方法)无法存入(treeSet使用的比较方法)。
由于元素有序,TreeSet中有如下特有方法:
访问第一个,最后一个 Object first() object last()
访问前一个,后一个 object lower(Object o) object higher(Object o)
截取自Treeset(3种) SortedSet subSet(fromElem, toElem) 包含头,不包含尾
SortedSet subSet(toElem) 从TreeSet头到toElem(不包含尾)
SortedSet subSet(fromElem) 从fromElem(包含)到TreeSet尾
定义排序使用的比较器 Comparator comparator();该方法返回定制排序所使用的对象的Comparator。如果使用的是自然排序,返回null
与HashSet采用hash算法hashcode决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元(是否存储,存储位置等)。
2、TreeSet类自然排序
TreeSet不是根据插入的先后顺序进行排序的,而是根据元素的大小进行排序的。TreeSet支持两种方式的排序:自然排序和定制排序。
自然排序:调用集合元素的CompareTo(Object obj)方法比较元素大小,然后将元素按照升序排序。Java中提供了一个Comparable接口,其中定义了CompareTo(Object obj)方法,添加到TreeSet中的对象必须继承了Comparable接口,并实现了其中的CompareTo方法。Java中一些常用类已经实现了该接口,例如String(Unicode),Boolean(true大于false)等。
即TreeSet只根据public int compareTo(Object obj)方法判断是否相等
0:相等
正整数:调用方法的对象大于obj
负整数:调用方法的对象小于obj
3、实际我们比较对象一般使用equals,当equals返回的结果为相等时,认为两个对象相同。此时comparator的结果也应该为相等。HashSet的hashCode也应该相等。即避免存入相同的元素。
4、TreeSet类定制排序
TreeSet的自然排序时根据元素的大小按照升序排序。如果希望实现定制排序,例如降序排序,可以通过Comparator接口。该接口中声明了一个compare(T o1, T o2)方法:升序:该方法用于比较两个元素的大小,如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0。降序相反
按照需要复写Comparator接口中的compare方法,然后以Comparator实现类对象为参数,调用TreeSet的构造函数,建立Treeset集合,即可实现定制排序。
例如:分别按照工资降序排列:
package jnxy.com.cn;
public class Employee {
private String name;
private int salary;
public Employee() {
super();
}
public Employee(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String toString() {
return "姓名是:" + this.name + ",工资:" + this.salary;
}
}
package jnxy.com.cn;
import java.util.Comparator;
public class SalaryComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Employee employee1 = (Employee) o1;
Employee employee2 = (Employee) o2;
// return (p1.age>p2.age)?1:((p1.age==p2.age)?0:-1);
int es1 = employee1.getSalary();
int es2 = employee2.getSalary();
if (es1 > es2)
return -1;
else if (es1 == es2)
return 0;
else
return 1;
}
}
package jnxy.com.cn;
import java.util.*;
public class TreeSetDemo {
/**
* @author yn 按照工资的多少降序输出
*/
public static void main(String[] args) {
SalaryComparator sc=new SalaryComparator();
@SuppressWarnings("unchecked")
TreeSet<Employee> treeSet = new TreeSet<Employee>(sc);
// 怎么让Employee对象实现Comparable接口
Employee bb = new Employee("李四", 6000);
Employee cc = new Employee("王五", 5600);
Employee dd = new Employee("马六", 7500);
Employee aa = new Employee("张三", 8000);
treeSet.add(aa);
treeSet.add(bb);
treeSet.add(cc);
treeSet.add(dd);
// 怎样将员工的工资降序输出
System.out.println(treeSet);
}
}