首页 > 其他分享 >Set集合的直接子类TreeSet

Set集合的直接子类TreeSet

时间:2024-10-16 18:59:33浏览次数:1  
标签:Set name int 子类 age Dog String public TreeSet

一、TreeSet:

底层数据结构是红黑树(自平衡二叉树),具备了可预测的排序

1.自然排序

通过实现comparable接口,重写里面的compareTo方法来进行排序

1.编写一个Dog类,实现了Comparable接口,并重写里面的方法

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

    public Dog() {
    }

    public Dog(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 String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Dog o) {
        // this - 待插入元素
        // o - 要比较的根元素
        //当姓名和年龄一样的时候去重,年龄需要从小到大排序
        //return this.age - o.getAge();
        //显式条件
        int i=this.age-o.getAge();
        //隐式条件
        //当年龄一样的时候,姓名不一定一样
        return (i==0)?this.name.compareTo(o.getName())   :i;
    }
}

2.测试类

import java.util.TreeSet;

public class TreeSetDemo2 {
    public static void main(String[] args) {
        TreeSet<Dog> treeSet = new TreeSet<>();
        Dog d1 = new Dog("煤球",3);
        Dog d2 = new Dog("旺财",2);
        Dog d3 = new Dog("小灰",3);
        Dog d4 = new Dog("煤球",3);
        Dog d5 = new Dog("白线",4);

        treeSet.add(d1);
        treeSet.add(d2);
        treeSet.add(d3);
        treeSet.add(d4);
        treeSet.add(d5);
        //当传入一个对象的成员变量值的时候,我们要实现Comparable接口,并重写compareTo方法,里面的内容决定按照什么排序
        System.out.println(treeSet);
    }
}

2.比较器排序

可以不实现comparable接口,传递一个 Comparator 对象

1.先编写一个Dog1类

package com.day14;

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

    public Dog1() {
    }

    public Dog1(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 String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2.再编写测试类

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

public class TreeSetDemo3 {
    public static void main(String[] args) {
        //使用比较器排序,匿名内部类
        TreeSet<Dog1> treeSet = new TreeSet<>(new Comparator<Dog1>() {
            @Override
            public int compare(Dog1 o1, Dog1 o2) {
                int i=o1.getAge()- o2.getAge();
                return (i==0)?o1.getName().compareTo(o2.getName()):i;
            }
        });
        Dog1 d1 = new Dog1("煤球",3);
        Dog1 d2 = new Dog1("旺财",2);
        Dog1 d3 = new Dog1("小灰",3);
        Dog1 d4 = new Dog1("煤球",3);
        Dog1 d5 = new Dog1("白线",4);


        treeSet.add(d1);
        treeSet.add(d2);
        treeSet.add(d3);
        treeSet.add(d4);
        treeSet.add(d5);
        //当传入一个对象的成员变量值的时候,我们要实现Comparable接口,并重写compareTo方法,里面的内容决定按照什么排序
        System.out.println(treeSet);
    }

}

二、TreeSet的练习题:

键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台

1.先编写一个学生类,注意一下这个学生类我们需要编写一个方法用来获取总分

public class Student2 {
    //姓名,语文成绩,数学成绩,英语成绩
    private String name;
    private int chinese;
    private int math;
    private int english;

    public Student2() {
    }

    public Student2(String name, int chinese, int math, int english) {
        this.name = name;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }

    public String getName() {
        return name;
    }

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

    public int getChinese() {
        return chinese;
    }

    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEnglish() {
        return english;
    }

    public void setEnglish(int english) {
        this.english = english;
    }

    public int getSumScore() {
        return chinese + math + english;
    }

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", chinese=" + chinese +
                ", math=" + math +
                ", english=" + english +
                '}';
    }
}

2.编写测试类,这个测试类需要去进行排序,按照年龄的大小,这里使用比较器排序,就不用实现comparable接口,重写里面的方法

public class TreeSetTest1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //创建一个TreeSet集合
        TreeSet<Student2> set1 = new TreeSet<>(new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                //显式条件:按照总分从高到低输出到控制台
                int i1 = o2.getSumScore() - o1.getSumScore();
                //隐式条件
                //总分一样,语文成绩不一定一样
                int i2 = (i1 == 0) ? o2.getChinese() - o1.getChinese() : i1;
                //总分一样,语文成绩一样,数学成绩不一定一样
                int i3 = (i2 == 0) ? o2.getMath() - o1.getMath() : i2;
                //各科成绩一样,姓名不一定一样
                return (i3 == 0) ? o2.getName().compareTo(o1.getName()) : i3;
            }
        });

        for(int i=1;i<=5;i++){
            System.out.println("请输入第 "+i+" 个学生的信息");
            System.out.print("请输入姓名: ");
            String name = sc.next();
            System.out.print("请输入该学生的语文成绩: ");
            int chinese = sc.nextInt();
            System.out.print("请输入该学生的数学成绩: ");
            int math = sc.nextInt();
            System.out.print("请输入该学生的英语成绩: ");
            int english = sc.nextInt();
            set1.add(new Student2(name,chinese,math,english));
        }

        System.out.println("学生信息录入完毕!!");
        System.out.println("================= 学生成绩汇总 ===================");
        System.out.println("姓名\t\t语文成绩\t\t数学成绩\t\t英语成绩\t\t总分");
        //遍历集合
        for (Student2 student2 : set1) {
            System.out.println(student2.getName()+"\t\t"+
                    student2.getChinese()+"\t\t"+
                    student2.getMath()+"\t\t"+
                    student2.getEnglish()+"\t\t"+
                    student2.getSumScore());
        }


    }
}

标签:Set,name,int,子类,age,Dog,String,public,TreeSet
From: https://www.cnblogs.com/ndmtzwdx/p/18470559

相关文章

  • Set集合具体实现子类HashSet的子类LinkedHashSet
    一、LinkedHashSet集合的特点:底层数据结构是哈希表和双链表。哈希表保证元素唯一,双链表保证元素有序,元素唯一二、LinkedHashSet集合的使用场景他保持了HashSet集合的特点,所以当我们传入一个对象想要进行去重的时候需要重写里面的hashCode方法和equals方法。publicclassLinke......
  • Set集合的具体子类:HashSet
    一、HashSet的特点:底层数据结构是哈希表,查找速度快,且元素唯一二、HashSet的使用特点:1.向HashSet集合中添加基本数据类型或者String元素的时候会自动去重importjava.util.HashSet;publicclassHashSetDemo1{publicstaticvoidmain(String[]args){//使用......
  • List集合的具体子类:LinkedList
    一、LinkedList集合的特点:底层的数据结构是双链表,增删快,查询慢,线程不安全,效率高二、特殊功能:publicvoidaddFirst(Ee)及addLast(Ee)addFirst是在集合的第一个位置进行添加,addLast是在集合的最后一个位置进行添加publicEgetFirst()及getLast()getFirst是获取集合的第一......
  • 【C++】C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • C++ STL迭代器、resize和reserve区别、map和unordered_map区别,vector和List区别、map
    1.STL迭代器删除元素迭代器失效是指在对容器进行修改时,原有的迭代器可能变得不可用。正确删除元素的方法是使用erase,并返回新的有效迭代器。示例代码#include<iostream>#include<vector>intmain(){  std::vector<int>vec={1,2,3,4,5};  //输出......
  • Idea-Maven的Setting文件盘配置
    目录1.Setting.xml2.Setting.xml选其中之一就行。直接全部复制就行。1.Setting.xml<?xmlversion="1.0"encoding="UTF-8"?><!--LicensedtotheApacheSoftwareFoundation(ASF)underoneormorecontributorlicenseagreements.SeetheNOTI......
  • 3DRealCar: An In-the-wild RGB-D Car Dataset with 360-degree Views
    3DRealCar:AnIn-the-wildRGB-DCarDatasetwith360-degreeViewsDu,XiaobiaoandSun,HaiyangandWang,ShuyunandWu,ZhuojieandSheng,HongweiandYing 来自很多单位,其中企业所在单位是LiAuto项目地址:https://xiaobiaodu.github.io/3drealcar/ gitcode: h......
  • BC2402C. 多重集(set)
    BC2402C.多重集(set)题意给你两个集合\(A,B\),开始时集合为空。有\(n\)次操作,每次往其中一个集合插入或者删除一个数对\((a,b)\),保证删除的数对存在。每次操作后输出\(\min_{x,y}\{\max(a_x+a_y,b_x+b_y),(a_x,b_x)\inA,(a_y,b_y)\inB\}\)。思路一个显然的优化是按照......
  • JedisCluster 中psetex()方法如何使用
    JedisCluster 中的 psetex 方法用于设置一个键值对,并同时设置该键的过期时间(以毫秒为单位)。与 setex 的区别在于 psetex 接受的过期时间是以毫秒为单位,而 setex 接受的是以秒为单位。psetex方法说明方法签名:publicStringpsetex(Stringkey,longmilliseconds......
  • iOS Swift 集合类型 (Array、Set 和 Dictionary ) 与 元组
    语言提供数组(Array)、集合(Set)和字典(Dictionary)三种基本的集合类型用来存储集合数据。数组是有序数据的集。集合是无序无重复数据的集。字典是无序的键值对的集。Swift中的数组、集合和字典必须明确其中保存的键和值类型,这样就可以避免插入一个错误数据类型的值。同理,对于获......