博客信息

集合框架TreeSet(自然排序、数据结构二叉树、比较器排序)

发布时间:『 2019-05-13 09:38』  博客类别:java基础  阅读(723)

TreeSet自然排序

TreeSet可以对set集合中元素进行排序

String实现了Comparable接口,所以可以直接进行排序

引用数据类型想要排序,必须实现Comparable接口

小李飞刀_集合框架

 

 

其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。

小李飞刀_集合框架


注意:排序时,当主要条件相同时,一定要判断次要条件



TreeSet数据结构(二叉树)


可以对set集合进行排序,底层数据结构是二叉树;

保证元素唯一性的依据是,compareTo方法return 0

 

所以

TreeSet排序的第一种方式,让元素自身具有比较性;

元素需要实现Comparable接口,覆盖compareTo方法;

这种方式也被称为元素的自然顺序,或者叫做默认顺序。


图解二叉树排序

小李飞刀_集合框架

那么如何让TreeSet集合中的元素怎么存进去怎么取出来呢?

compareTo方法返回值为正数,返回值写死,那么就是怎么存进去怎么取出来。

compareTo方法返回值为负数数,返回值写死,那么就是先进后出。


TreeSet比较器排序


TreeSet排序的第二种方式

当元素自身不具备比较性时,或者具备的比较性不是所需要的;

 

这时需要让集合自身具备比较性

在集合初始化时,就有了比较方式;

 

定义一个类,实现comparator接口,实现compare方法

 

当两种排序都存在时,比较器排序优先级更高

因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,

那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法 

  

用两个案例说明

1、打破原有的person排序规则进行排序

2、按照字符串长度进行排序(String默认是按照hashCode值进行排序的)


相关代码

package com.javaxl;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-05-13 21:20
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        method_string(args);
//        method_person(args);
    }

    /**
     * 引用数据类型具备排序特性的两种方式
     * 1、元素自身具备比较性
     * 2、容器具备比较性
     * @param args
     */
    public static void method_person(String[] args) {

//        TreeSet treeSet = new TreeSet();
        TreeSet treeSet = new TreeSet(new PersonComparable());
        treeSet.add(new Person("java01",11));
        treeSet.add(new Person("java02",22));
        treeSet.add(new Person("java03",33));
        treeSet.add(new Person("java04",36));
        treeSet.add(new Person("java01",22));
        treeSet.add(new Person("java05",22));
        Iterator it = treeSet.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }


    /**
     * 1、string默认排序规则
     * 2、按照字符串长度进行排序(有个小坑注意)
     * @param args
     */
    public static void method_string(String[] args) {

//        TreeSet treeSet = new TreeSet();
        TreeSet treeSet = new TreeSet(new StringComparator());
        treeSet.add("adfsd");
        treeSet.add("adfdsfsdf");
        treeSet.add("safdsfsdfss");
        treeSet.add("adsfsfsddfdsf");
        treeSet.add("ddfsd");
        Iterator it = treeSet.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

class Person implements Comparable{
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 先按年龄升序,再按名字字符串hashCode值比
     * @param o
     * @return
     */
    @Override
    public int compareTo(Object o) {
        int num = 0;
        if(o instanceof Person){
            Person p = (Person)o;
            num = this.getAge() - p.getAge();
            if(num == 0)
                return this.getName().compareTo(p.getName());
    }
        return num;
    }
}

/**
 * 修改原有的排序规则
 *      先按名字字符串hashCode值降序,再按年龄升序
 */
class PersonComparable implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        Person p1 = (Person)o1;
        Person p2 = (Person)o2;
        int num = p2.getName().compareTo(p1.getName());
        if(num == 0)
            return p1.getAge()-p2.getAge();
        return num;
    }

//    沒有使用比較器
//    Person{name='java01', age=11}
//    Person{name='java01', age=22}
//    Person{name='java02', age=22}
//    Person{name='java05', age=22}
//    Person{name='java03', age=33}
//    Person{name='java04', age=36}

//    使用比較器
//    Person{name='java05', age=22}
//    Person{name='java04', age=36}
//    Person{name='java03', age=33}
//    Person{name='java02', age=22}
//    Person{name='java01', age=11}
//    Person{name='java01', age=22}
}

class StringComparator implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        String s2 = (String)o2;
        int num = s1.length()-s2.length();
        if(num == 0)
            return s1.compareTo(s2);
        return num;
    }
}





关键字:     Java基础       集合框架       TreeSet  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有