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集合实现排序。