集合之Set【TreeSet】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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(); } } |
练习:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律