TreeSet实现类中的元素是无序的,但是可以按照一定的顺序遍历,当我们自定义一个类,就需要用Comparable接口或者Comparator接口覆写其中的方法来实现元素之间的比较排序。
用Person类为例(需要覆写hashCode()和equals()方法)
**
1.Comparable接口
**
第一步,Person类implements接口
第二步,在Person类中覆写compareTo()方法
//在Person类中覆写
@Override
public int compareTo(Object o) {
if(o instanceof Person){
Person person=(Person)o;
//return this.age-person.age;
// int型对象没有方法,所以只能返回运算;如果Integer age,可以用return this.age.compareTo(person.age)
int i=this.age.compareTo(person.age);
if(i==0){
return this.name.compareTo(person.name);
}else
return i;
}
return 0;
}
2.Comparator接口
(1)内部类写法
public class TreeSetTest {
@Test
public void test() {
Comparator com=new Comparator(){
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Person && o2 instanceof Person){
Person person1=(Person)o1;
Person person2=(Person)o2;
int i=person1.getAge().compareTo(person2.getAge());
if(i==0){
return person1.getName().compareTo(person2.getName());
}else
return i;
}
return 0;
}
};
Set set=new TreeSet(com);
set.add(new Person("张三",18));
set.add(new Person("李四",15));
set.add(new Person("王五",20));
set.add(new Person("王六",20));
set.add(new Person("朱六",19));
set.add(new Person("赵钱",23));
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
**(2)外部类写法**
自定义一个MyComparator类implements Comparator
class MyComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Person && o2 instanceof Person){
Person person1=(Person)o1;
Person person2=(Person)o2;
int i=person1.getAge().compareTo(person2.getAge());
if(i==0){
return person1.getName().compareTo(person2.getName());
}else
return i;
}
return 0;
}
}
public class TreeSetTest {
@Test
public void test() {
MyComparator mcom=new MyComparator();
Set set=new TreeSet(mcom);
set.add(new Person("张三",18));
set.add(new Person("李四",15));
set.add(new Person("王五",20));
set.add(new Person("王六",20));
set.add(new Person("朱六",19));
set.add(new Person("赵钱",23));
Iterator iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
两种方法的主要区别: Comparale接口是在集合的元素类中(如Person类)实现的,需要覆写compareTo( )方法 Comparator接口是在TreeSet集合对象中或者自定义的比较器中使用,需要覆写compare方法;并且还要创建Comparator对象,并把此对象传递给TreeSet中
*以上为个人拙见,如有意见或建议,欢迎读者指出*