java基础:去重和排序3(TreeSet:去重与排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39081169/article/details/81556876

TreeSet:去重与排序
方法1、
TreeSet同样在存储字符串时会自动对字符串进行排序与排序
但对于存储对象元素的集合来说还是需要我们自定义规则,再根据规则重写方法进行排序

TreeSet存储字符串自动实现排序的原理:
在往集合添加元素时,add()方法调用了字符串的compareTo方法
compareTo方法时来自于Comparable接口,并按照字典顺序比较两个字符串
注:默认是升序并且是按照字典排序

    解释下字典顺序:
* 字典顺序:按照ASCII表比较当前的两个字符,ASCII码大的认为是大的字符
* 规则:从左边第一个字符开始比较
* 如果当前的字符不相同,直接认为ASCII大的字符串是大字符串,后面的字符停止比较
* 当前字符比较的具体规则:使用前面的字符-后面的字符,返回差值.如果是负数,说明前面的字符串小于后面的.反之前面的大.
* 如果当前的字符相同,再去比较第二个字符,依次往后推,如果比到最后都相同,则认为两个字符串相等,差值返回0.

所以和上面一样,我们同样要重写对应的方法来排序,我们要重写compareTo()方法

建类实现Comparable接口
 
class Person implements Comparable{
    String name;
    int age;
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    //重写compareTo方法
    //按照姓名和年龄比较,只要姓名和年龄相同就认为是同一个人

    public int compareTo(Object obj){
        //首先进行容错处理
        if(!(obj instanceof Person)){
            throw new ClassCastException();
        }

        //向下转型
        Person person=(Person)obj;
        
        //先按照年龄比,年龄相同再按照姓名比
        int num=age-person.age;
        return num==0?name.compareTo(person.name):num;
    
    }

public static void main(String[] args) {

        //实例:将Person的对象存储入TreeSet,实现排序和去重
        TreeSet set1 = new TreeSet<>();
        set1.add(new Person("bobo", 20));
        set1.add(new Person("bobo", 18));
        set1.add(new Person("bobo3", 200));
        set1.add(new Person("bobo5", 20));
        set1.add(new Person("bobo", 20));
        
        System.out.println(set1);
    }
}

方法2、
TreeSet的第二种排序方式:使用实现了Comparator接口的比较器对象实现比较

总结:对TressSet的排序有两种方式:
1、实现
Comparable接口的compareTo方法---系统排序
2、实现
Comparetor接口的compare方法---人工排序

系统让人工排序的优先级高于系统排序,方便人工排序的实现

实例:实现将字符串按照从短到长排序,长度相同按照字典排序

//创建比较器
class  ComWithLength implements Comparator{
    
    public int compare(Object o1,Object o2){
    
    //首先进行容错处理
        if(!(o1 instanceof String)){
            throw new ClassCastException("类型转换错误");
            }

        if(!(o2 instanceof String)){
            throw new ClassCastException("类型转换错误");
            }

        //向下转型
        String s1=(String)o1;
        String s2=(String)o2;
     
   //字符串按照从短到长排序,长度相同按照字典排序
        int num=s1.length()-s2.length();
        return num==0?s1.compareTo(s2):num;
        }
    }

    public static void main(String[]args){
     
   //创建一个比较器对象
        ComWithLength comWithLength = new ComWithLength();
        
     
   //将比较器对象传给当前的TreeSet对象
        TreeSet set=new TreeSet<>(comWithLength);
        set.add("java1ttt");
        set.add("java4");
        set.add("java3kk");
        set.add("java1");
        
        System.out.println(set);
    }


上一篇:java基础 去重2(HashSet对象集合):https://blog.csdn.net/qq_39081169/article/details/81556789

猜你喜欢

转载自blog.csdn.net/qq_39081169/article/details/81556876