集合之Set【TreeSet】
package com.Lucky;
import java.util.Iterator;
import java.util.TreeSet;
/**
* TreeSet:底层采用红黑树结构
* 可排序【默认从小到大】/无重复/无索引
*
*
* 注意点:1.在数据类型为数字型时,仍然按照从小到大排序
* 2.在数据类型为char或String类型时,会根据ASCll编码的数字大小排序【跟字典的26个字母排序相同】
*
*/
public class TreeSetDemo {
public static void main(String[] args) {
//创建TreeSet集合
TreeSet<Integer> ts=new TreeSet<>();
TreeSet<TestDemo> tsStudent=new TreeSet<>();
//添加元素
ts.add(1);
ts.add(5);
ts.add(9);
ts.add(4);
ts.add(2);
//遍历输出
Iterator<Integer> ite = ts.iterator();
while (ite.hasNext()){
System.out.print(ite.next()+"\t"); //自动从小到大进行排序
}
System.out.println();
ts.forEach(str-> System.out.print(str+"\t"));
System.out.println();
System.out.println("--------------排序习题-----------------");
//创建TestDemo对象
TestDemo tr=new TestDemo("黎唯易",22);
TestDemo tr4=new TestDemo("黎新丰",32);
TestDemo tr3=new TestDemo("黎易",26);
TestDemo tr2=new TestDemo("黎唯易",22);
System.out.println(tsStudent.add(tr)); //报异常:ClassCastException
System.out.println(tsStudent.add(tr4));//在自定义的数据类型中不知道比较规则
System.out.println(tsStudent.add(tr3)); //解决方法1:用javabean类实现Comparable接口,重新comparaTo()方法
System.out.println(tsStudent.add(tr2));
//遍历数据
for (TestDemo testDemo : tsStudent) {
System.out.println(testDemo);
}
}
}
TestDemo:
package com.Lucky;
import java.util.Objects;
public class TestDemo implements Comparable<TestDemo>{
private String name;
private int age;
public TestDemo() {
}
public TestDemo(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 boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
TestDemo testDemo = (TestDemo) o;
return age == testDemo.age && Objects.equals(name, testDemo.name);
}
//在这重写hashCode方法,
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "TestDemo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// 重新compareTo按照年龄排序
/*
this:要添加的数据
o :已经在红黑树存在的数据
return: 负数:在红黑树的左边
正数:在红黑树的右边
0:已经在红黑树存在,舍弃
*/
@Override
public int compareTo(TestDemo o) {
return this.getAge()-o.getAge();
}
}
练习:
package com.Lucky;
import java.util.Comparator;
import java.util.TreeSet;
/*
要求 :创建五个Student对象 ,有属性:姓名/年龄/语文/数学/英语
先按照总分从高到低排序
总分一样,就按照语文成绩排序
如果语文成绩也一样,就按照数学成绩排序
如果数学成绩也一样,就按照英语成绩排序
如果英语成绩也一样,就按照年龄排序
如果年龄也一样,就按照字母排序
*/
public class TreeSetDemoThree {
public static void main(String[] args) {
//创建集合
//自定义比较器对象【如果自然排序和比较器同时存在,采用自定义比较器方法】
TreeSet<Student> tree=new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int i=o1.getVerbal()+o1.getMath()+o1.getEnglish();
int t=o2.getVerbal()+o2.getMath()+o2.getEnglish();
int val=i-t;
//比较语文成绩
val= val==0 ?o1.getVerbal()-o2.getVerbal():val;
//比较数学成绩
val= val==0 ? o1.getMath()-o2.getMath():val;
//比较英语成绩
val= val==0 ? o1.getEnglish()-o2.getEnglish():val;
//比较年龄
val= val==0 ? o1.getAge()-o2.getAge():val;
//比较字母排序
val= val==0 ? o1.getName().compareTo(o2.getName()):val;
return val;
}
});
//创建Student对象
Student stud1=new Student("唯易",22,98,95,85);
Student stud2=new Student("新风",21,80,65,85);
Student stud3=new Student("张三",23,70,88,77);
Student stud4=new Student("李四",27,98,60,66);
Student stud5=new Student("王五",23,98,95,85);
//往集合添加数据
tree.add(stud1);
tree.add(stud2);
tree.add(stud3);
tree.add(stud4);
tree.add(stud5);
for (Student student : tree) {
int sum= student.getMath()+student.getEnglish()+student.getVerbal();
System.out.println(student+"总分是:"+sum);
}
}
}
浙公网安备 33010602011771号