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

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

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 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());
        }
    }
}


控制台输出:


liubing 18

zhaoxiao 18

wangyi 24

xiaozhan 29

hanyan 30


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)方法

重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件

目录
相关文章
|
5天前
|
安全 Java 大数据
|
1天前
|
Java
Java对象和类研究
Java对象和类研究
6 0
|
1天前
|
XML Java 测试技术
Java异常处理神器:Guava Throwables类概念与实战
【4月更文挑战第29天】在Java开发中,异常处理是保证程序稳定性和可靠性的关键。Google的Guava库提供了一个强大的工具类Throwables,用于简化和增强异常处理。本篇博客将探讨Throwables类的核心功能及其在实战中的应用。
7 2
|
1天前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
5天前
|
人工智能 安全 Java
Java8 - LocalDateTime时间日期类使用详解
Java8 - LocalDateTime时间日期类使用详解
|
6天前
|
缓存 Java 程序员
|
6天前
|
安全 Java 程序员
|
6天前
|
存储 设计模式 算法
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
Java从入门到精通:2.1.1深入学习Java核心技术——掌握Java集合框架
|
6天前
|
存储 Java C++
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列
17 0
|
2月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)