黑马程序员--07.集合框架--08.【TreeSet的Comparator排序】【TreeSet总结】

集合框架--7

      TreeSet的Comparator排序    TreeSet总结

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.    TreeSet的Comparator排序

1). Comparator应用的背景

如果对象元素不具有比较性 (就是存入集合的元素所在的类本身没有实现Comparable接口)或者对象元素自身的比较性不符合需求(也就是不符合需求中的排序规则)。并且集合中的元素类不能被修改。此时就要使用Comparator这个接口来达到所需的排序功能。

2). Comparator的使用方式

(1). TreeSet的构造方法

[1]. public TreeSet()

构造一个空参的TreeSet。这个TreeSet根据自然顺序(默认的顺序)进行排序

[2]. public TreeSet(Comparator<?super E>comparator)

    构造一个TreeSet。这个TreeSet根据Comparator比较器中的规则进行排序

(2). Comparator接口介绍

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

}

(3). 示例代码的普通写法

【示例代码】学生姓名先排序,如果姓名相同,按照年龄排序

class MyComparator implements Comparator{
    public int compare(Object o1, Object o2){
        if(!((o1 instanceof Student)&&(o2 instanceof Student))){
            throw new RuntimeException("Sorry");
        }
        Students1 =(Student)o1;
        Students2 =(Student)o2;
       
        int num =s1.getName().compareTo(s2.getName());
        if(num ==0)
            return s1.getAge() -s2.getAge();
        return num;
    }
}
 
class TreeSetDemoII{
    public static void sop(Object o){
        System.out.println(o);
    }
 
    public static void main(String[] args){
        TreeSetts =new TreeSet(new MyComparator());
        ts.add(new Student("lisi02", 22));
        ts.add(new Student("lisi007", 20));
        ts.add(new Student("lisi09", 19));
        ts.add(new Student("lisi09", 18));
       
        Iteratorit =ts.iterator();
        while(it.hasNext()){
            sop(it.next());
        }
    }
}

打印结果:


(4). 示例代码的匿名内部类写法

class TreeSetDemoIII{
    public static void sop(Object o){
        System.out.println(o);
    }
    public static void main(String[] args){
        TreeSetts =new TreeSet(new Comparator(){
            @Override
            public int compare(Object o1, Object o2) {
                if(!(o1 instanceof Student && o2 instanceof Student))
                    throw new RuntimeException("非法输入");
                Students1 =(Student)o1;
                Students2 =(Student)o2;
               
                int nameDifference=s1.getName().compareTo(s2.getName());
               
                if(nameDifference ==0)
                    return s1.getAge() -s2.getAge();
               
                return nameDifference;
            }
           
        });
       
        ts.add(new Student("lisi02", 22));
        ts.add(new Student("lisi007", 20));
        ts.add(new Student("lisi09", 19));
        ts.add(new Student("lisi09", 18));
       
        Iteratorit =ts.iterator();
        while(it.hasNext()){
            sop(it.next());
        }
 
    }
}

打印结果:


【比较优先级】元素容器本身具有比较性的时候,容器比较器优先

这里面Student类和TreeSet容器都具有比较性,Student是age主条件----age相同,比较name

容器本身是:name主条件----name相同,比较age

返回的排序结果就是容器比较性的排序。

2.    TreeSet总结

1). TreeSet的特点

(1). 可以对元素进行排序

       有两种排序方式。

(2). TreeSet保证元素的唯一性依据

       在实现的ComparablecompareTo或者Comparatorcompare方法中,如果这两个方法的返回值0,那么TreeSet就认为这两个元素一样。按照Set的唯一性规则,在一次重复的元素不能被添加到TreeSet这个集合中。

2). TreeSet的两种排序方式

(1). 让元素本身具有比较性

       元素本身实现Comparable接口实现里面的compareTo方法保证元素本身具有比较性

(2). 让容器自身具有比较性

       当元素本身不具有比较性或者具备的比较性不是所需要的,就在TreeSet建立实例的时候,传入Comparator接口的实现子类的实例。这个Comparator子类必须实现compare方法

(3). 元素的可存储性

[1]. 自定义的类,如果重写了hashCodeequals两个方法,可以存入HashSet容器

[2]. 自定义的类,如果实现了Comparable的compareTo()方法,可以存入TreeSet容器

【总结】如果 自定义的类重写了 hashCodeequals实现了 compareTo,那么这个类的元素 可以存入HashSet容器可以存入 TreeSet容器

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值