24-JavaSE基础巩固练习:Tree集合综合练习

Tree集合练习

1、对象排序练习题

需求
  • 创建5个学生对象

  • 属性:姓名、年龄、语文成绩、数学成绩、英语成绩

  • 按照总分从高到低输出到控制台

    如果总分一样,按照语文成绩排序

    如果语文分数一样,按照数学成绩排序

    如果数学分数一样,按照英语成绩排序

    如果英语分数一样,按照年龄大小排序

    如果年龄一样,按照姓名的字母顺序排序

    如果都一样,认为是同一个学生,不存。


分析
  • 第一种排序方式:默认排序/自然排序
  • 第二种:比较器排序
  • 默认情况下,用第一种排序方式,如果第一种不能满足当前的需求,采取第二种方式。

实现
(1)学生类
package com.app.demo29_tree_test;

/*
    学生类
 */
public class Student implements Comparable<Student>{
    // 属性:姓名、年龄、语文成绩、数学成绩、英语成绩
    private String name;
    private int age;
    private int chinese;
    private int math;
    private int english;

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return chinese
     */
    public double getChinese() {
        return chinese;
    }

    /**
     * 设置
     * @param chinese
     */
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    /**
     * 获取
     * @return math
     */
    public double getMath() {
        return math;
    }

    /**
     * 设置
     * @param math
     */
    public void setMath(int math) {
        this.math = math;
    }

    /**
     * 获取
     * @return english
     */
    public double getEnglish() {
        return english;
    }

    /**
     * 设置
     * @param english
     */
    public void setEnglish(int english) {
        this.english = english;
    }

    public String toString() {
        return "Student {姓名:" + name + ", 年龄:" + age +
                ", 语文成绩:" + chinese + ", 数学成绩:" + math +
                ", 英语成绩" + english +
                ", 总分:" + getSum(chinese, math, english) + "}";
    }

    /*
        按照总分从高到低输出到控制台
        如果总分一样,按照语文成绩排序
        如果语文分数一样,按照数学成绩排序
        如果数学分数一样,按照英语成绩排序
        如果英语分数一样,按照年龄排序
        如果年龄一样,按照姓名的字母顺序排序
        如果都一样,认为是同一个学生,不存。
     */
    @Override
    public int compareTo(Student s) {
        int sum1 = getSum(this.chinese, this.math, this.english);
        int sum2 = getSum(s.chinese, s.math, s.english);
        // 按照总分从高到低排序
        int i = sum1 - sum2;
        // 如果总分一样,按照语文成绩排序
        i = i == 0 ? this.chinese - s.chinese : i;
        // 如果语文分数一样,按照数学成绩排序
        i = i == 0 ? this.math - s.math : i;
        // 如果数学分数一样,按照英语成绩排序
        //(这个可省略不写,因为语文、数学成绩都一样了,英语成绩也是一样的)
        i = i == 0 ? this.english - s.english : i;
        // 如果英语分数一样,按照年龄排序
        i = i == 0 ? this.age - s.age : i;
        // 如果年龄一样,按照姓名的字母顺序排序
        i = i == 0 ? this.name.compareTo(s.name) : i;
        // 如果都一样,认为是同一个学生,不存。
        return i;
    }

    // 求所有课程成绩的总和
    public int getSum(int chinese, int math, int english) {
        // 返回总和
        return chinese + math + english;
    }
}

(2)测试类
package com.app.demo29_tree_test;

import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        /*
            需求:
              1.创建5个学生对象
              2.属性:姓名、年龄、语文成绩、数学成绩、英语成绩
              3.按照总分从高到低输出到控制台
                如果总分一样,按照语文成绩排序
                如果语文分数一样,按照数学成绩排序
                如果数学分数一样,按照英语成绩排序
                如果英语分数一样,按照年龄排序
                如果年龄一样,按照姓名的字母顺序排序
                如果都一样,认为是同一个学生,不存。
         */
        // 创建集合
        TreeSet<Student> students = new TreeSet<>();
        // 创建学生对象
        Student s1 = new Student("zhangfei", 23, 90, 99, 50);
        Student s2 = new Student("zhaoyun", 24, 90, 98, 50);
        Student s3 = new Student("guanyu", 25, 95, 100, 30);
        Student s4 = new Student("machao", 26, 60, 99, 70);
        Student s5 = new Student("huangzhong", 26, 70, 80, 70);
        Student s6 = new Student("huangzhong", 26, 70, 80, 70);
        // 将学生对象添加到集合中
        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);
        students.add(s5);
        students.add(s6);

        // 直接输出集合
//        System.out.println(students);
        // 遍历集合
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

(3)测试结果
Student {姓名:huangzhong, 年龄:26, 语文成绩:70, 数学成绩:80, 英语成绩70, 总分:220}
Student {姓名:guanyu, 年龄:25, 语文成绩:95, 数学成绩:100, 英语成绩30, 总分:225}
Student {姓名:machao, 年龄:26, 语文成绩:60, 数学成绩:99, 英语成绩70, 总分:229}
Student {姓名:zhaoyun, 年龄:24, 语文成绩:90, 数学成绩:98, 英语成绩50, 总分:238}
Student {姓名:zhangfei, 年龄:23, 语文成绩:90, 数学成绩:99, 英语成绩50, 总分:239}

Process finished with exit code 0



(4)总结

1、TreeSet集合的特点是什么?

  • 可排序、不重复、无索引
  • 底层基于红黑树实现排序,增删改查性能较好

2、TreeSet集合自定义排序规则有几种方式?

  • 方式一:JavaBean类实现Comparable接口,指定比较规则
  • 方式二:创建集合时,自定义Comparator比较器对象,指定比较规则

3、方法返回值的特点

  • 负数:表示当前要添加的元素是小的,存左边
  • 正数:表示当前要添加的元素是大的,存右边
  • 0:表示当前要添加的元素已经存在,舍弃

4、集合的使用场景?

  • 如果想要集合中的元素可重复,用ArrayList集合,基于数组的。(用的最多
  • 如果想对集合中的元素去重,用HashSet集合,基于哈希表的。(用的最多
  • 如果想要集合中的元素可重复,而且当前的增删操作明显多于查询,用LinkedList集合,基于链表的。
  • 如果想对集合中的元素去重,而且保证存取顺序,用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。
  • 如果想对集合中的元素进行排序,用TreeSet集合,基于红黑树。后续也可以用List集合实现排序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值