您的位置:首页 > 其它

TreeSet的第二种排序方式:比较器

2017-04-07 13:43 330 查看
/*
TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

TreeSet(Comparator<? super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
当两种排序都存在时,以比较器为主。
如何实现比较器:
定义一个类,实现Comparator接口,覆盖compare方法

*/
import java.util.*;

class  SetDemo2
{
public static void main(String[] args)
{
//指定比较器
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student("sh3",23));
ts.add(new Student("sh4",24));
ts.add(new Student("hh1",21));
ts.add(new Student("dh2",22));
ts.add(new Student("ah5",22));

Iterator it = ts.iterator();
while(it.hasNext())
{
Student sd = (Student)it.next();
System.out.println("name:"+sd.getName()+" age:"+sd.getAge());
}
}
}

//自定义的比较器,按姓名排序
class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;

return s1.getName().compareTo(s2.getName());
}
}

class Student implements Comparable
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}

//自动调用
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
{
throw new RuntimeException("对象转换不成功!");
}
Student s = (Student)obj;
if(this.age>s.age)
return 1;
else if(this.age == s.age)
{
//如果年龄相同,则再比较姓名
return this.name.compareTo(s.name);
}
else
return -1;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: