欢迎使用CSDN-markdown编辑器

来源:互联网 发布:尔玛网络 编辑:程序博客网 时间:2024/06/13 05:29

 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中



以上为个人拙见,如有意见或建议,欢迎读者指出