Java对象比较-comparable接口和comparator比较器
程序员文章站
2022-03-04 20:09:40
...
1.实现对对象的比较大部分是为了对数组或者集合中的对象进行排序,让他们根据一定的规则存储在数组或有序集合中
2.实现方式有两种,一种是存储的对象的类实现comparable接口,第二种是使用comparator比较器,也有人称为comparator匿名
内部类;两种方式都是通过给对象提供一个自定义的比较规则去实现对象之间的比较
3.首先了解一下比较规则
程序实现比较的核心是编写比较规则,在实现comparable接口方法中是实现compareTo方法,return返回正数则代表前一个对象“大”需要排在后面,返回0表示对象级别“相同”,负数与正数相反;
comparator比较器同过编写compare方法,返回值return的内容同上述比较规则;
4.现在看一下comparable接口实现比较功能的一些案例
此处的对象列表对应list,有序映射中的键对应key值
给出一个示例student类
package StudyJava;
public class student implements Comparable<student> {
private String name;
private int age;
private String sex;
public student(String name, int age, String sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
// 希望以年龄先排序,再以姓名排序,最后以性别排序,男前女后
@Override
public int compareTo(student stu) {
int result = 0;
result = this.age==stu.age ? result=0 : (this.age>stu.age ? 1 : -1);
if(result==0){
result = this.name.compareTo(stu.name);
}
if(result==0){
result = -this.sex.compareTo(stu.sex);
}
return result;
}
}
通过compareTo的返回值去实现你的排序规则
package StudyJava;
import java.util.Arrays;
public class test {
public static void main(String[] args) {
student[] students = new student[6];
students[0] = new student("AA", 21, "female");
students[1] = new student("FF", 42, "female");
students[2] = new student("BB", 21, "man");
students[3] = new student("AA", 21, "man");
students[4] = new student("DD", 33, "female");
students[5] = new student("CC", 22, "man");
for(student stu : students){
System.out.println(stu.toString());
}
System.out.println("..........");
Arrays.sort(students);
for(student stu : students){
System.out.println(stu.toString());
}
}
}
测试结果:
也有遇到过自己编写比较方法,但实现底层依然交由comparator的compare方法实现
这里按照输入的参数名,以该参数作为规则排序 内部传入list集合参数,对集合处理后返回处理过的新list
使用的是comparator比较器实现
5.comparator比较器实现
System.out.println("comparator比较器实现对象比较......");
List<teacher> list = new ArrayList<teacher>();
list.add(new teacher("ZZ", 30));
list.add(new teacher("AA", 30));
list.add(new teacher("CC", 24));
for(teacher tea : list){
System.out.println(tea.toString());
}
System.out.println("........");
Collections.sort(list, new Comparator<teacher>() {
@Override
public int compare(teacher arg0, teacher arg1) {
int result = 0;
if(arg0.getAge()==arg1.getAge()){
result = arg0.getName().compareTo(arg1.getName());
}else if(arg0.getAge()>arg1.getAge()){
result = 1;
}else{
result = 0;
}
return result;
}
});
for(teacher tea : list){
System.out.println(tea.toString());
}
测试结果:
其中,comparator匿名内部类本身是使用无参构造函数,在实现比较规则中利用String类的comparaTo
方法可以实现对字符串进行字典集规则比较
推荐阅读
-
Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
-
Collections包装类和Comparator比较器
-
java比较器Comparator原理笔记
-
C#程序编写高质量代码改善的157个建议【10-12】[创建对象时需要考虑是否实现比较器、区别对待==和Equals]
-
java比较器 --- 使用Comparator实现定制排序
-
java中对象的比较equal、Comparble、Comparator的区别
-
Java语言基础-比较器和二叉树基础实现
-
Java 两种比较器的区别:Comparable 与 Comparator
-
Comparable和Comparator两个比较器,map集合
-
Java比较器——Comparable接口和Comparator接口