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); } } }
标签:Set,name,val,TestDemo,add,Student,集合,public,TreeSet From: https://www.cnblogs.com/Lucky-only/p/16975361.html