天天看点

【Java集合类】之TreeSet集合与Comparable/Comparator排序

【Java集合类】之TreeSet集合与Comparable/Comparator排序

个人名片:

🐼作者简介:一名大一在校生

🐻‍❄️个人主页:​​小新爱学习.​​ 🐼

🕊️系列专栏:零基础学java ----- 重识c语言 ---- 计算机网络

🐓每日一句:没的选,往往是一种最好的自己

文章目录

  • ​​上节回顾: LinkedHashSet集合概述及特点​​
  • ​​LinkedHashSet集合的储存和遍历:​​
  • ​​1.1 TreeSet集合概述和特点​​
  • ​​1.2 构造方法:​​
  • ​​1.3 方法摘要:​​
  • ​​1.3 总结:​​
  • ​​1.4 Demo:​​
  • ​​1.5 自然排序Comparable的使用​​
  • ​​接口 Comparable< T>​​
  • ​​Demo:​​
  • ​​1.6 比较器排序Comparator的使用​​
  • ​​Demo:​​
  • ​​总结:​​
  • ​​欢迎添加微信,加入我的核心小队,请备注来意​​
【Java集合类】之TreeSet集合与Comparable/Comparator排序

上节回顾: LinkedHashSet集合概述及特点

LinkedHashSet集合特点

  • 哈希表和链表实现Set接口,具有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 由哈希表保证元素唯一,也就是说没有重复元素

LinkedHashSet集合的储存和遍历:

import java.util.LinkedHashSet;

/**
 * LinkedListSet 集合特点
 *      1.哈希表和链表实现Set接口,具有可预测的迭代次序
 *      2.由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
 *      3.由哈希表保证元素唯一,也就是说没有重复元素
 */
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        //创建集合对象
        LinkedHashSet<String> linkHashSet = new LinkedHashSet<String>();

        //添加元素
        linkHashSet.add("hello");
        linkHashSet.add("world");
        linkHashSet.add("java");


        linkHashSet.add("hello");
        //遍历集合(增强for)
        for(String s:linkHashSet){
            System.out.println(s);
        }
    }
}      

1.1 TreeSet集合概述和特点

java.util

类 TreeSet

java.lang.Object

继承者 java.util.AbstractCollection< E>

继承者 java.util.AbstractSet< E>

继承者 java.util.TreeSet< E>

public class TreeSet< E>

extends AbstractSet< E>

implements NavigableSet< E>, Cloneable, Serializable

基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

1.2 构造方法:

构造方法 描述
TreeSet() 构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c) 构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet s) 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。

1.3 方法摘要:

方法 说明
boolean add(E e) 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
void clear() 移除此 set 中的所有元素。
Iterator iterator() 返回在此 set 中的元素上按升序进行迭代的迭代器。
boolean remove(Object o) 将指定的元素从 set 中移除(如果该元素存在于此 set 中)。

1.3 总结:

TreeSet集合特点

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法

    TreeSet() |构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。

    TreeSet(Comparator<? super E> comparator) |构造一个新的空 TreeSet,它根据指定比较器进行排序。

  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合,所以不包含重复元素的集合

1.4 Demo:

package com.ithmm_03;

import java.util.TreeSet;

/**
 * TreeSet集合特点
 *
 * 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方法取决于构造方法
 * TreeSet() |构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
 * TreeSet(Comparator<? super E> comparator) |构造一个新的空 TreeSet,它根据指定比较器进行排序。
 * 没有带索引的方法,所以不能使用普通for循环遍历
 * 由于是Set集合,所以不包含重复元素的集合
 */
public class TreeSetDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Integer> ts = new TreeSet<Integer>();

        //添加元素
        ts.add(10);
        ts.add(40);
        ts.add(90);
        ts.add(30);
        ts.add(18);

        ts.add(30);

        //遍历集合(增强For)
        for(Integer s:ts){
            System.out.println(s);
        }
    }
}      
控制台输出:10 18 30 40 90

1.5 自然排序Comparable的使用

接口 Comparable< T>

  • 类型参数:

    T - 可以与此对象进行比较的那些对象的类型

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

总结:

  • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  • 自认排序,就是让元素所属的类实现Compareable接口,重写compareTo(To)方法
  • 重写方法时,一定注意排序规则必须按照要求的主要条件和次要调价来写

Demo:

  • 储存学生对象并遍历,创建TreeSet集合使用无参构造
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字幕顺序排序

    学生类:

package com.ithmm_03;



public class Student  implements Comparable<Student> {
    private String name;
    private int age;

    public Student() {
    }

    public Student(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;
    }
    @Override
    public int compareTo(Student s) {
      //  return 0;//认为是重复元素,不添加
       // return 1;//升序存储
       // return -1;//降序存储

        //按照年龄从从小到大排序
        int num = this.age - s.age;
        //按照年龄从大到小排序
        //int num = s.age - this.age;

        //年龄相同时,按照姓名首字母顺序排序
       int num2  = num==0?this.name.compareTo(s.name):num;
        return num2;
    }
}      

测试类:

import java.util.TreeSet;

public class TreeSetDemo02  {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet <Student> ts = new TreeSet<Student>();

        //创建学生对象
        Student s1 = new Student("xiaozhan",29);
        Student s2 = new Student("wangyi",24);
        Student s3 = new Student("hanyan",30);
        Student s4 = new Student("zhaoxiao",18);

        Student s5 = new Student("liubing",18);

        //把学生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        //遍历集合
        for(Student s : ts){
            System.out.println(s.getName() + " " + s.getAge());
        }
    }
}      

1.6 比较器排序Comparator的使用

Demo:

  • 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字幕顺序排序

    学生类:

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(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;
    }

}      
import java.util.TreeSet;

public class TreeSetDemo02  {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet <Student> ts = new TreeSet<Student>();

        //创建学生对象
        Student s1 = new Student("xiaozhan",29);
        Student s2 = new Student("wangyi",24);
        Student s3 = new Student("hanyan",30);
        Student s4 = new Student("zhaoxiao",18);

        Student s5 = new Student("liubing",18);

        //把学生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);


        //遍历集合
        for(Student s : ts){
            System.out.println(s.getName() + " " + s.getAge());
        }
    }
}      

总结:

  • 用TreeSet集合存储自定义对象,代参构造方法使用的是比较器排序对元素进行排序的
  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1,To2)方法
  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件

继续阅读