比较器,,

比较器
  • 比较器的实质就是重载比较运算符
  • 比较器可以很好地应用在特殊标准的排序上
  • 比较器可以很好地应用在特殊标准排序的结构上
  • 写代码变得异常容易,还用于范型编程
语言提供的堆结构 VS 手写的堆结构
  • 取决于,你有没有动态该信息的需求!
  • 语言提供的堆结构,如果你动态改数据,不保证依然有序
  • 手写堆结构,因为增加了对象的位置表,所以能够满足动态改信息的需求
package com.harrison.class04;

import java.util.Comparator;
import java.util.PriorityQueue;

public class Code04_Comparator {
	public static class MyComparator implements Comparator<Integer> {
		// 任何比较器:compare方法里,遵循一个统一的规范:
		// 返回负数的时候,认为第一个参数应该排在前面
		// 返回正数的时候,认为第二个参数应该排在前面
		// 返回0的时候,认为无所谓谁放前面
		@Override
		public int compare(Integer o1, Integer o2) {
			// TODO Auto-generated method stub
			return o2 - o1;// 默认小根堆:return o1-o2
		}
	}

	public static void main(String[] args) {
		// 在Java中,PriorityQueue默认是小根堆
		// 现在我们要将其组织为大根堆,自己手动改写堆
		PriorityQueue<Integer> heap = new PriorityQueue<>(new MyComparator());
		heap.add(4);
		heap.add(9);
		heap.add(-3);
		heap.add(3);
		heap.add(99);
		while (!heap.isEmpty()) {
			System.out.println(heap.poll());
		}
	}
}

package com.harrison.class04;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.TreeMap;

public class Code05_Comparator {
	public static class Student {
		public String name;
		public int id;
		public int age;

		public Student(String name, int id, int age) {
			this.name = name;
			this.id = id;
			this.age = age;
		}
	}
	
	public static class IdAscendingAgeDescendOrder implements Comparator<Student>{
		// 根据id从小打到,如果id一样,按照年龄从大到小
		@Override
		public int compare(Student o1, Student o2) {
			// TODO Auto-generated method stub
			return (o1.id==o2.id)?(o2.age-o1.age):o1.id-o2.id;
		}
	}
	
	public static class IdAscendingComparator implements Comparator<Student>{

		@Override
		public int compare(Student o1, Student o2) {
			// TODO Auto-generated method stub
			return o1.id-o2.id;
		}
		
	}
	
	public static class IdDescendComparator implements Comparator<Student>{

		@Override
		public int compare(Student o1, Student o2) {
			// TODO Auto-generated method stub
			return o2.id-o1.id;
		}
	}
	
	public static void printStudents(Student[] students) {
		for(Student student:students) {
			System.out.println("Name:"+student.name+",Id:"+student.id+",Age:"+student.age);
		}
	}
	
	public static void main(String[] args) {
		Student s1=new Student("A", 5, 34);
		Student s2=new Student("B", 2, 23);
		Student s3=new Student("C", 9, 32);
		Student s4=new Student("D", 2, 18);
		Student s5=new Student("E", 8, 21);
		Student[] students=new Student[] {s1,s2,s3,s4,s5};
		System.out.println("第一条打印:");
		Arrays.sort(students,new IdAscendingAgeDescendOrder());
		for(int i=0; i<students.length; i++) {
			Student s=students[i];
			System.out.println(s.id+","+s.name+","+s.age);
		}
		
		System.out.println("第二条打印");
		ArrayList<Student> stuList=new ArrayList<>();
		stuList.add(s1);
		stuList.add(s2);
		stuList.add(s3);
		stuList.add(s4);
		stuList.add(s5);
		stuList.sort(new IdAscendingAgeDescendOrder());
		for(int i=0; i<stuList.size(); i++) {
			Student s=stuList.get(i);
			System.out.println(s.id+","+s.name+","+s.age);
		}
		
		System.out.println("第三条打印");
		s1=new Student("A", 4, 40);
		s2=new Student("B", 4, 21);
		s3=new Student("C", 4, 12);
		s4=new Student("D", 4, 62);
		s5=new Student("E", 4, 42);
		TreeMap<Student, String> treeMap=new TreeMap<>((a,b)->(a.id-b.id));
		treeMap.put(s1, "我是学生1,我的名字叫A");
		treeMap.put(s2, "我是学生2,我的名字叫B");
		treeMap.put(s3, "我是学生3,我的名字叫C");
		treeMap.put(s4, "我是学生4,我的名字叫D");
		treeMap.put(s5, "我是学生5,我的名字叫E");
		for(Student s:treeMap.keySet()) {
			System.out.println(s.id+","+s.name+","+s.age);
		}
	}
}

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的Harrison

从来无所求,所得皆惊喜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值