——- android培训、java培训、期待与您交流! ———-
当元素不具备可比性或者元素所具备的可比性不是所需要的时,
那该怎么办呢???
修改代码是一件很痛苦的事情!
我们应当避免这种痛苦!
这就引出了TreeSet的第二种排序方式:
让集合具备可比性。
那么该怎么做才能让集合具备可比性呢???
答案是构造比较器Comparator,
并将comparator对象作为参数传递给TreeSet构造函数,
由于Comparator是接口,要创建类实现该接口,
并且重写compare(o1,o2)方法!
下面对此进行演示:
import java.util.*;
//学生类自身不具备可比性
class Student
{
private String name;//学生姓名
private int age;//学生年龄
//构造函数传递参数
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
//创建类实现Comparator接口
class MyComparator implements Comparator
{
public int compare(Object o1,Object o2)
{
//强制转换为Student类型
Student s1 = (Student)o1;
Student s2 = (Student)o2;
//判断两学生年龄关系
int num = new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
//如果年龄相等,判断姓名
if( num == 0)
return s1.getName().compareTo(s2.getName());
//否则不判断姓名,返回年龄关系
return num;
}
}
//主类
class TreeSetComparatorDemo
{
public static void main(String[] args)
{
//1 创建TreeSet集合
TreeSet ts = new TreeSet(new MyComparator());
//2 添加学生对象
ts.add(new Student("Jack",20));
ts.add(new Student("Jane",21));
ts.add(new Student("Jane",21));
ts.add(new Student("Jimmy",20));
ts.add(new Student("Jone",15));
ts.add(new Student("Jone",15));
ts.add(new Student("Tom",26));
ts.add(new Student("Jordan",16));
//迭代取出
for(Iterator it = ts.iterator(); it.hasNext(); )
{
//强制转换为Student对象
Student stu = (Student)it.next();
System.out.println(stu.getName()+"----"+stu.getAge());
}
}
}
运行结果:
Jone—-15
Jordan—-16
Jack—-20
Jimmy—-20
Jane—-21
Tom—-26
这与第一种排序方式运行结果一致,
说明已经成功的对学生对象进行了去重存入,
并自动排序成功!
小结:如果两种排序方式都存在,要以比较器为主,
因为这样修改起来方便!