Java集合框架 Set接口实现类--TreeSet概述及使用

Posted Z && Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合框架 Set接口实现类--TreeSet概述及使用相关的知识,希望对你有一定的参考价值。

Collection体系集合

Ser子接口


1. TreeSet概述


2. TreeSet的使用


2.1 示例代码01 保存String类型(String类默认实现了Comparable接口

package set;

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

/**
 * 使用TreeSet保存数据
 * 存储结构:红黑树
 * 要求:元素类必须实现Comparable接口,compareTo方法返回0,认为是重复元素
 */
public class TreeSetDemo01 {
    public static void main(String[] args) {
        TreeSet<String> strs = new TreeSet<String>();
        /*
        添加元素
         */
        strs.add("edqwddwad");
        strs.add("ddqeeqwf");
        strs.add("cfqewfqw");
        strs.add("bfweqfqw");
        strs.add("aqwfqfeqw");
        strs.add("aqwfqfeqw");// 不可以添加重复的数据
        System.out.println("String类型默认按照第一个字符的ASCII码大小正序排序: \\n" + strs.toString() + "\\n");
        /*
        删除元素
         */
        strs.remove("ddqeeqwf");
        strs.remove("cfqewfqw");
        System.out.println("删除了ddqeeqwfcfqewfqw和: \\n" + strs.toString() + "\\n");
        /*
        遍历集合
         */
        System.out.println("--------------使用增强for遍历--------------");
        for (String str : strs) {
            System.out.print(str + "\\t");
        }
        System.out.println();

        System.out.println("--------------使用迭代器遍历--------------");
        Iterator<String> iterator = strs.iterator();
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + "\\t");
        }
        System.out.println("\\n");
        /*
        判断
         */
        System.out.println("集合中是否包含edqwddwad: " + strs.contains("edqwddwad"));
        System.out.println("集合中是否为空: " + strs.isEmpty());
    }
}

运行结果:


2.2 示例代码02 保存自定义类型

package set;

import java.util.TreeSet;

public class TreeSetDemo02 {
    public static void main(String[] args) {
        TreeSet<Student> treeSet = new TreeSet<>();
        Student s1 = new Student("小明", 22);
        Student s2 = new Student("小明", 21);
        Student s3 = new Student("小明", 19);
        Student s4 = new Student("小明", 23);
        Student s5 = new Student("小明", 20);
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);
        treeSet.add(s5);
        System.out.println(treeSet.toString());
    }
}

/*
自定义学生类
 */
class Student {
    private final String name;
    private final int age;

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

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

运行结果:

原因: 学生类没有实现Comparable接口

改进后:

package set;

import java.util.TreeSet;

public class TreeSetDemo02 {
    public static void main(String[] args) {
        TreeSet<Student> treeSet = new TreeSet<>();
        Student s1 = new Student("小明", 22);
        Student s2 = new Student("小立", 21);
        Student s3 = new Student("小周", 19);
        Student s4 = new Student("小王", 23);
        Student s5 = new Student("小邓", 20);
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);
        treeSet.add(s5);
        System.out.println(treeSet.toString());
    }
}

/*
自定义学生类
 */
class Student implements Comparable<Student> {
    private final String name;
    private final int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

    /**
     * MethodName: compareTo
     * Description: 如果年龄不同,就按照年龄的正序排序
     * 如果年龄相同, 就按照字符串自带的compareTo方法排序
     *
     * @return int
     */
    @Override
    public int compareTo(Student student) {
        return (this.age - student.getAge() == 0 ? this.name.compareTo(student.getName()) : this.age - student.getAge());
    }
}

运行结果:

备注: 因为我们重写了compareTo方法,所以当我们删去匿名的对象时,只要内容匹配,一样可以删除;并且在新增的时候,只可以增加一个内容匹配的对象。

    public static void main(String[] args) {
        TreeSet<Student> treeSet = new TreeSet<>();
        Student s1 = new Student("小明", 22);
        Student s2 = new Student("小立", 21);
        Student s3 = new Student("小周", 19);
        Student s4 = new Student("小王", 23);
        Student s5 = new Student("小邓", 20);
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);
        treeSet.add(s5);
        treeSet.remove(new Student("小明", 22));
        System.out.println(treeSet.toString());
        treeSet.add(new Student("小明", 22));
        treeSet.add(new Student("小明", 22));
        treeSet.add(new Student("小明", 22));
        treeSet.add(new Student("小明", 22));
        treeSet.add(new Student("小明", 22));
        System.out.println("\\n" + treeSet.toString());
    }



以上是关于Java集合框架 Set接口实现类--TreeSet概述及使用的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架 Set接口实现类--HashSet的使用

Java知识33 集合框架 List接口 Map 和set多测师

Java_集合框架

Java集合类框架的基本接口有哪些?

JAVA集合框架包含的内容

Java中集合框架,Collection接口Set接口List接口Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现