Java中 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构。和普通的HashMap不一样,普通的HashMap元素存取的时间复杂度一般是O(1)的范围,而TreeMap内部对元素的操作复杂度为O(logn)。
虽然在元素的存取方面TreeMap并不占优,但是它内部的元素都是排序的,当需要查找某些元素以及顺序输出元素的时候它能够带来比较理想的结果。可以说,TreeMap是一个内部元素排序版的HashMap。同样,TreeSet是一个封装了一个HashSet的成员变量来实现的,底层运用了红黑树的数据结构。
这里主要展现TreeSet的两种常用方法:
其中em2例子中的Comparable接口用法很重要;
em1:
public class TreeSetTest {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
set.add("abc");
set.add("xyz");
set.add("rst");
System.out.println(set);//可以直接输出
Iterator itSet = set.iterator();//也可以遍历输出
while(itSet.hasNext())
System.out.print(itSet.next() + "\t");
System.out.println();
}
}
输出结果为:
[abc, rst, xyz]
abc rst xyz
em2:
//自定义数据类型,并在自定义的数据类型中实现CompareTo方法
class Teacher implements Comparable {
int num;
String name;
Teacher(String name, int num) {
this.num = num;
this.name = name;
}
public String toString() {
return "学号:" + num + " 姓名:" + name;
}
//按照num属性先排一次序,如果num的值相同时再按照name属性的字母顺序进行排序;
public int compareTo(Object o) {
Teacher ss = (Teacher) o;
int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);
if (result == 0) {
result = name.compareTo(ss.name);
}
return result;
}
}
public class TreeSetTest {
public static void main(String[] args) {
Set<Teacher> treeSet = new TreeSet<Teacher>();
treeSet.add(new Teacher("zhangsan", 2));
treeSet.add(new Teacher("lisi", 1));
treeSet.add(new Teacher("wangwu", 3));
treeSet.add(new Teacher("mazi", 3));
//向TreeSet中添加的元素必须是同一类
System.out.println(treeSet);//直接输出
Iterator itTSet = treeSet.iterator();//遍历输出
while(itTSet.hasNext())
System.out.print(itTSet.next() + "\t");
System.out.println();
}
}
输出结果为:
[学号:1 姓名:lisi, 学号:2 姓名:zhangsan, 学号:3 姓名:mazi, 学号:3 姓名:wangwu]
学号:1 姓名:lisi 学号:2 姓名:zhangsan 学号:3 姓名:mazi 学号:3 姓名:wangwu