项目中需要按照时间先后排序,想到了TreeSet。TreeSet实际上调用的TreeMap的put方法,排序分成两种:自然排序和自定义排序,区别在于构造方法不一样:
构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
要求:TreeSet中装的对象实现comparable接口,比较的是其compareTo方法
2.自定义排序的构造方法:TreeSet(ComparatorE> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
要求传入一个实现了Comparator接口的子类对象,或者匿名类对象。
Demo:
public classTestTreeSet {
@Test
public voidtest1()throwsParseException {
String s1 ="2017-07-22 08:00:00";
String s2 ="2017-07-23 08:00:00";
String s3 ="2017-07-24 08:00:00";
String s4 ="2017-07-25 08:00:00";
String s5 ="2017-07-26 08:00:00";
TreeSet treeSet =newTreeSet(newComparator() {
public intcompare(Date o1, Date o2) {
returno1.before(o2)?1:-1;//o1 小于 o2 o2放在二叉树右边 注意新添加进来的永远是o1
}
});
treeSet.add(DateUtil.String2Date(s2));//s2相当于红黑树(本质是二叉树)的根节点
treeSet.add(DateUtil.String2Date(s1));//s1 相当于 o1 s2 相当于 o2
treeSet.add(DateUtil.String2Date(s3));
treeSet.add(DateUtil.String2Date(s4));
treeSet.add(DateUtil.String2Date(s5));
//最后的输出是按照树的中序遍历(左中右的顺序)取出
for(Date date: treeSet) {
System.out.println(date.toLocaleString());
}
}
}
public classDateUtil {
/**
* Date2String 并格式化输出
* 例如:2017-8-9 19:46:47
*@paramdate日期
*@return2017-8-9 19:46:47
*/
public staticString Date2String(Date date){
SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
returnsdf.format(date);
}
/**
* String2Date
*@paramdateString
*@return
*@throwsParseException
*/
public staticDate String2Date(String dateString)throwsParseException {
SimpleDateFormat sdf =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
returnsdf.parse(dateString);
}
}
输出结果:
2017-7-26 8:00:00
2017-7-25 8:00:00
2017-7-24 8:00:00
2017-7-23 8:00:00
2017-7-22 8:00:00
补充:二叉树的遍历的三种方式
前序遍历:中在左边,即中左右的顺序。
中序遍历:中在中间,即左中右的顺序。
后序遍历:中在右边,即左右中的顺序。
例如:

先序输出:
A B D G H E C K F I J
中序输出:
G D H B E A K C I J F
后序输出:
G H D E B K J I F C A
网友评论