对象比较器之comparator

博客介绍了对象比较器,重点讲解了Comparator接口。当已定义好的类不想修改时,可通过自定义类实现Comparator接口来强行对对象collection进行整体排序,还给出了示例及测试时的注意事项,如排序需带上自定义排序规则类,否则会报错。

对象比较器

对两个或多个数据项进行比较,以确定它们是否相等,或确定它们之间的大小关系及排列顺序为比较。 

1.Comparator

 Comparator接口是要求自定义类去实现,按照OO原则;对修改关闭,对扩展开放。

如果这个类已经定义好了,不想去修改它,那么需要Comparator接口:强行对某个对象collection进行整体排序的比较。 

已经定义好的Student类(不想修改):

package com.lemon;

public class Student {
	private String name;
	private int age;
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		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 String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	

}

自定义类ComparatorDemo.java

(实现Comparator接口,从而自定义排序规则)

import java.util.Comparator;

public class ComparatorDemo implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		//自定义排序规则
		return o1.getAge() - o2.getAge();
	}



}

测试: 

		Student[] stu = {new Student("贝贝",6),new Student("欢欢",4),new Student("妮妮",5)};
		
		Arrays.sort(stu,new ComparatorDemo()); //排序规则
		System.out.println(Arrays.toString(stu));

注意:

Arrays.sort(stu,new ComparatorDemo()); //排序规则

一定要带上自定义的排序规则类,否则报错 java.lang.ClassCastException

### Java Comparator接口详解 #### Comparator接口概述 `Comparator` 是一个用于定义对象之间比较方式的函数式接口。通过实现 `compare(T o1, T o2)` 方法,可以自定义排序逻辑[^1]。 ```java public interface Comparator<T> { int compare(T o1, T o2); } ``` 此方法返回负整数、零或正整数分别表示第一个参数小于、等于或大于第二个参数。 #### 使用示例:按成绩对学生进行排序 当需要根据特定属性(如学生成绩)对列表进行排序时,可以通过创建实现了 `Comparator` 接口的对象来完成这一操作: ```java import java.util.*; class Student { private String name; private double score; public Student(String name, double score) { this.name = name; this.score = score; } // Getter and Setter methods... } // 定义一个基于分数降序排列学生的比较器 class ScoreDescendingComparator implements Comparator<Student> { @Override public int compare(Student s1, Student s2) { return Double.compare(s2.getScore(), s1.getScore()); } } List<Student> students = Arrays.asList( new Student("Alice", 90), new Student("Bob", 85), new Student("Charlie", 95)); students.sort(new ScoreDescendingComparator()); for (Student student : students) { System.out.println(student.getName() + ": " + student.getScore()); } ``` 这段代码展示了如何利用 `Comparator` 对象对 `Student` 列表按照成绩高低进行排序。 #### 结合Java 8 Stream API使用 借助于Java 8引入的强大流式编程特性——Stream API,能够更加简洁高效地处理集合数据的操作,比如排序。下面的例子说明了怎样结合 `Comparator` 来对映射结构 (`Map`) 中的数据项依据其值大小实施升序/降序整理[^2]: ```java import java.util.*; import java.util.stream.Collectors; Map<String, Integer> map = Map.ofEntries( Map.entry("apple", 3), Map.entry("banana", 2), Map.entry("orange", 4)); map.entrySet().stream() .sorted(Map.Entry.comparingByValue()) .forEach(System.out::println); System.out.println("---"); map.entrySet().stream() .sorted(Collections.reverseOrder(Map.Entry.comparingByValue())) .forEach(System.out::println); ``` 这里先是调用了 `comparingByValue()` 函数获取默认自然顺序下的键值对比较器;接着又应用了 `Collections.reverseOrder()` 反转该比较器的方向从而达到逆向排序的效果。 #### 常见问题解答 - **Q:** 如果希望同时考虑多个字段作为排序条件怎么办? A: 可以链式调用 `thenComparing()` 方法构建复合型比较器实例。例如先按年龄再按姓名字母先后次序组织人员名单: ```java List<Person> people = ... ; Collections.sort(people, Comparator.comparingInt(Person::getAge).thenComparing(Person::getName)); ``` - **Q:** 是否可以在不修改原有类的情况下为其添加新的排序行为? A: 是的,这正是 `Comparator` 设计的目的之一。只要外部提供了合适的比较策略,则无需改变目标实体内部设计就能灵活调整排序规则[^3].
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值