package cn.itcast.demo;
import java.util.*;
class Person implements Comparable
{
private String name;
private int age;
private int score;
Person(String name,int age,int score)
{
this.name=name;
this.age=age;
this.score=score;
}
public int getAge()
{
return age;
}
public String getName()
{
return name;
}
public int getScore()
{
return score;
}
public int compareTo(Object obj)
{
if (!(obj instanceof Person))
{
throw new RuntimeException("吊爆了!");
}
Person p=(Person)obj;
if (this.age>p.age)
{
return 1;
}
if (this.age==p.age)
{
return this.name.compareTo(p.name);
}
return -1;
}
}
class TreeSetTest1
{
public static void main(String[] args)
{
//TreeSet t=new TreeSet(new Mycompare()); //按照姓名
//TreeSet t=new TreeSet(new Mycompare1()); //按照年龄
TreeSet t=new TreeSet(new Mycompare2()); //按照分数
t.add(new Person("xxc1",15,99));
t.add(new Person("xxc2",20,98));
t.add(new Person("xxc6",17,108));
t.add(new Person("xxc3",16,77));
t.add(new Person("xxc5",10,230));
Iterator t1=t.iterator();
while (t1.hasNext())
{
Person p=(Person)t1.next();
System.out.println(p.getName()+"======"+p.getAge()+"======"+p.getScore());
}
}
}
class Mycompare1 implements Comparator
{
public int compare(Object o1,Object o2)
{
Person p=(Person)o1;
Person p1=(Person)o2;
//int num=p.getAge().compareTo(p1.getAge());
int num = p.getAge() -p1.getAge();
if (num==0)
{
return new Integer (p.getAge()).compareTo(new Integer(p1.getAge()));
}
return num;
}
}
class Mycompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Person p=(Person)o1;
Person p1=(Person)o2;
int num=p.getName().compareTo(p1.getName());
if (num==0)
{
return new Integer (p.getAge()).compareTo(new Integer(p1.getAge()));
}
return num;
}
}
class Mycompare2 implements Comparator
{
public int compare(Object o1,Object o2)
{
Person p=(Person)o1;
Person p1=(Person)o2;
//int num=p.getAge().compareTo(p1.getAge());
int num = p.getScore() -p1.getScore();
if (num==0)
{
return new Integer (p.getAge()).compareTo(new Integer(p1.getAge()));
}
return num;
}
}
运行效果如下:
TreeSet的第一种排序方式是实现Comparable接口覆写compareTo方法,此排序是自然顺序排序。
TreeSet的第二种排序方式是实现Comparator接口覆写compare方法,此排序是在集合一初始化就拥有的,所以要讲此接口的实例对象传入到TreeSet的构造函数中。
2. TreeSet总结
1). TreeSet的特点
(1). 可以对元素进行排序
有两种排序方式。
(2). TreeSet保证元素的唯一性依据
在实现的Comparable的compareTo或者Comparator的compare方法中,如果这两个方法的返回值为0,那么TreeSet就认为这两个元素一样。按照Set的唯一性规则,在一次重复的元素不能被添加到TreeSet这个集合中。
2). TreeSet的两种排序方式
(1). 让元素本身具有比较性
元素本身要实现Comparable接口并实现里面的compareTo方法以保证元素本身具有比较性
(2). 让容器自身具有比较性
当元素本身不具有比较性或者具备的比较性不是所需要的,就在TreeSet建立实例的时候,传入Comparator接口的实现子类的实例。这个Comparator子类必须实现compare方法。
(3). 元素的可存储性
[1]. 自定义的类,如果重写了hashCode和equals两个方法,可以存入HashSet容器
[2]. 自定义的类,如果实现了Comparable的compareTo()方法,可以存入TreeSet容器。
【总结】如果自定义的类既重写了hashCode和equals,又实现了compareTo,那么这个类的元素既可以存入HashSet容器,也可以存入TreeSet容器。