使用Comparator接口
问题背景:
小编在日常开发中遇到一个问题:就是如何在含有实体类的泛型数组中对对象关键属性作为依据进行排列?
经过查到资料了解到Comparator接口可以实现改功能
Comparator可以比较的对象类型,是比较接口。我们如果需要控制某个类的次序,而该类本身不支持排
序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排
序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现
Comparator来新建一个比较器,然后通过这个比较器对类进行排序。
具体代码实现
写了一个内部类,和一个主方法,主方法内定义一个student内部类的泛型数组,具体实现如下:
package com.keiven.arrays;
import java.util.*;
/**
* @author Keiven
* @version 1.0
* @date 2022/3/7 20:32
*/
public class StudentDemo {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
list.add(new Student("小明", 55));
list.add(new Student("小华", 35));
list.add(new Student("小张", 75));
list.add(new Student("小七", 45));
// 使用Collections提供的方法进行排列 简易版
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getScore() - o2.getScore(); // 默认升序排列
}
});
// 复杂板
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.getScore() > o2.getScore())
return 1;
else if (o1.getScore() == o2.getScore() )
return 0;
else
return -1;
}
});
// 打印输出
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
}
}
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
}
运行结果
运行结果如下
值得注意的是:
若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
int compare(T o1, T o2) 是“比较o1和o2的大小”,其中o1指的就是第一个要比较的对象, o2指的就是第二要比的对象。 比较之后会根据大小返回值。 返回“负数”, 意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2。
不重写 Object.equals(Object) 方法总是安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。
总结:
通过本次记录学习,加强了对泛型数组比较的认知。后期会偶尔更新作品,还望大佬们批评指正。
相关文章
暂无评论...