12:比较器
12:比较器
1、比较器的实质是重载比较运算符;
2、比较器可以很好的应用在特殊标准的排序上;
3、比较器可以很好的应用在根据特殊标准的结构上;
4、写代码异常容易,还用于泛型编程;
1 public static class Student {
2 public String name;
3 public int id;
4 public int age;
5
6 public Student(String name, int id, int age) {
7 this.name = name;
8 this.id = id;
9 this.age = age;
10 }
11 }
12
13 // 任何比较器:
14 // compare方法里,遵循一个统一的规范:
15 // 返回负数的时候,认为第一个参数应该排在前面
16 // 返回正数的时候,认为第二个参数应该排在前面
17 // 返回0的时候,认为无所谓谁放前面
18 public static class IdShengAgeJiangOrder implements Comparator<Student> {
19
20 // 根据id从小到大,但是如果id一样,按照年龄从大到小
21 @Override
22 public int compare(Student o1, Student o2) {
23 return o1.id != o2.id ? (o1.id - o2.id) : (o2.age - o1.age);
24 }
25
26 }
1 public static void main(String[] args) {
2
3 Integer[] arr = { 5, 4, 3, 2, 7, 9, 1, 0 };
4
5 Arrays.sort(arr, new AComp());
6
7 for (int i = 0; i < arr.length; i++) {
8 System.out.println(arr[i]);
9 }
10
11 System.out.println("===========================");
12
13 Student student1 = new Student("A", 4, 40);
14 Student student2 = new Student("B", 4, 21);
15 Student student3 = new Student("C", 3, 12);
16 Student student4 = new Student("D", 3, 62);
17 Student student5 = new Student("E", 3, 42);
18 // D E C A B
19
20 Student[] students = new Student[] { student1, student2, student3, student4, student5 };
21 System.out.println("第一条打印");
22
23 Arrays.sort(students, new IdShengAgeJiangOrder());
24 for (int i = 0; i < students.length; i++) {
25 Student s = students[i];
26 System.out.println(s.name + "," + s.id + "," + s.age);
27 }
28
29 System.out.println("第二条打印");
30 ArrayList<Student> studentList = new ArrayList<>();
31 studentList.add(student1);
32 studentList.add(student2);
33 studentList.add(student3);
34 studentList.add(student4);
35 studentList.add(student5);
36 studentList.sort(new IdShengAgeJiangOrder());
37 for (int i = 0; i < studentList.size(); i++) {
38 Student s = studentList.get(i);
39 System.out.println(s.name + "," + s.id + "," + s.age);
40 }
41 // N * logN
42 System.out.println("第三条打印");
43 student1 = new Student("A", 4, 40);
44 student2 = new Student("B", 4, 21);
45 student3 = new Student("C", 4, 12);
46 student4 = new Student("D", 4, 62);
47 student5 = new Student("E", 4, 42);
//当定义比较器后,这里比较是id的值
//当student1进来后,student2在进treeMap时,会认为student2就是student1,
//尽管student1 和 student2是两个对象
48 TreeMap<Student, String> treeMap = new TreeMap<>((a, b) -> (a.id - b.id));
49 treeMap.put(student1, "我是学生1,我的名字叫A");
50 treeMap.put(student2, "我是学生2,我的名字叫B");
51 treeMap.put(student3, "我是学生3,我的名字叫C");
52 treeMap.put(student4, "我是学生4,我的名字叫D");
53 treeMap.put(student5, "我是学生5,我的名字叫E");
54 for (Student s : treeMap.keySet()) {
55 System.out.println(s.name + "," + s.id + "," + s.age);
56 }
57
58 }
59
60 }
分类:
算法笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧