我们知道java有很多集合,如set,map和list,虽然大部分set集合都是无序不可重复的,但还是有有序的set集合,如TreeSet,下面来看下这段代码

public class Tree {
public static void main(String[]args){
	TreeSet<Object> tree=new TreeSet<>();
	tree.add("a");
	tree.add("b");
	tree.add("c");
	Iterator<Object> it=tree.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}
}
}

java详解TreeSet_基础可以看到控制台打印的都是按字母表的顺序打印的,这是源于它内部的结构排序的,下面在看这种情况

首先定义一个person类

public class person {
private String name;
private int age;
public person(String name,int age){
	this.name=name;
	this.age=age;
}
public int getage(){
	return age;
}
public String getname(){
	return name;
}
public String toString(){
	return "[姓名:"+name+",年龄:"+age+"]";
}
}

然后把它放进TreeSet集合

public class Tree {
public static void main(String[]args){
	TreeSet<Object> tree=new TreeSet<>();
	tree.add(new person("小明",19));
	Iterator<Object> it=tree.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}
}
}

而运行的结果却产生了错误java详解TreeSet_TreeSet集合_02

 

这是因为TreeSet属于二叉树结构,放入集合的元素自身具有自然排序,所以要实现Comparable接口,重写它的compareTo方法

 

public class person implements Comparable{
private String name;
private int age;
public person(String name,int age){
	this.name=name;
	this.age=age;
}
public int getage(){
	return age;
}
public String getname(){
	return name;
}
public String toString(){
	return "[姓名:"+name+",年龄:"+age+"]";
	
}
@Override
public int compareTo(Object obj) {
	if(!(obj instanceof person)){
		throw new ClassCastException("类型错误");
	}else{
		person o=(person)obj;//向下转型
		return o.age-this.age==0?o.name.compareTo(this.name):o.age-this.age;//三目运算,先比较年龄,再比较姓名
	}
	
}
}

 

现在在放进TreeSet便不会有错误了

public class Tree {
public static void main(String[]args){
	TreeSet<Object> tree=new TreeSet<>();
	tree.add(new person("小明",19));
	tree.add(new person("小刚",18));
	tree.add(new person("小李",18));
	tree.add(new person("小何",17));
	Iterator<Object> it=tree.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}
}
}

 

java详解TreeSet_对象排序_03可以看到,它打印都是按照年龄由大到小排序的,而当年龄相同时则比较的是名字,名字是按ASCII码表的差值来排序的,这里就不详述,可以去了解一下。

除了实现comparable接口,重写copmareTo方法外还可以定义一个类实现Comparator接口

public class Compare implements Comparator{

	@Override
	public int compare(Object obj1, Object obj2) {
		person p1=(person)obj1;
		person p2=(person)obj2;
		return p1.getname().compareTo(p2.getname());
		
	}

}

这种是建立比较器的方法来排序,而前一种是自然排序,不同的是第二种是通过比较姓名排的,我们来看下运行结果

public class Tree {
public static void main(String[]args){
	TreeSet<Object> tree=new TreeSet<>(new Compare());
	tree.add(new person("小明",19));
	tree.add(new person("小刚",18));
	tree.add(new person("小李",18));
	tree.add(new person("小何",17));
	Iterator<Object> it=tree.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}
}
}

 

java详解TreeSet_java_04可以看到这和年龄没有关系,以上便是实现TreeSet对象排序的两种方法