我们知道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());
}
}
}
可以看到控制台打印的都是按字母表的顺序打印的,这是源于它内部的结构排序的,下面在看这种情况
首先定义一个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());
}
}
}
而运行的结果却产生了错误
这是因为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());
}
}
}
可以看到,它打印都是按照年龄由大到小排序的,而当年龄相同时则比较的是名字,名字是按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());
}
}
}
可以看到这和年龄没有关系,以上便是实现TreeSet对象排序的两种方法