浅谈Java中几种常见的比较器的实现方法

网友投稿 236 2023-03-28


浅谈Java中几种常见的比较器的实现方法

在java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。

通常对象之间的比较可以从两个方面去看:

第一个方面:对象的地址是否一样,也就是是否引用自同一个对象。这种方式可以直接使用“==“来完成。

第二个方面:以对象的某一个属性的角度去比较。

从最新的JDK8而言,有三种实现对象比较的方法:

一、覆写Object类的equals()方法;

二、继承Comparable接口,并实现compareTo()方法;

三、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。

由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。

覆写equals()方法,一般用于自己实现对象数组排序的情况,而对于要使用java内置的排序算法时,使用后面两种方式都是可行的。

先来看第二种方式,这种方式就是让自己编写的类继承Comparable接口,并实现compareTo()方法,这种情况下,在使用java.util.Arrays.sort()

方法时,不用指定具体的比较器,sort()方法会使用对象自己的比较函数来完成对象的排序。

下面是一个具体的例子:

import java.util.Arrays;

class BookCook implements Comparable{

private String title;

private double price;

public BookCook(String title,double price){

this.title = title;

this.price = price;

}

@Override

public String toString() {

return "书名:"+this.title+",价格:"+this.price;

}

@Override

public int compareTo(BookCook o) {

if(this.price > o.price){

return 1;

}else if(this.price < o.price){

return -1;

}else{

return 0;

}

}

}

一般我们使用以上两种方法就能够满足实际的开发问题。但是当出现以下情况时,就需要用到Comparator接口:

要在已经开发好的代码的基础上完善对象的比较功能时,又不想更改之前的代码,这种情况下,从JDK1.8之后出现了Comparator接口,是对这种情况的一个弥补。

这种情况下,我们需要单独定义一个对象比较器,继承Comparator接口,并实现compare()方法。示例代码如下:

class Student {

private String name;

private double score;

public Student(String name,double score){

this.name = name;

this.score = score;

}

public double getScore(){

return this.score;

}

@Override

public String toString() {

return "姓名:"+this.name+",分数:"+this.score;

}

}

class StudentComparator implements Comparator {

@Override

public int compare(Student o1,Student o2) {

if(o1.getScore() > o2.getScore()){

return 1;

}else if(o1.getScore() < o2.getScore()){

return -1;

}else{

return 0;

}

}

}

public class TestComparator {

public static void main(String[] args) {

Student[] sts = new Student[]{

new Student("小戴",60),

new Student("小王",90),

new Student("老王",80),

new Student("小萱",95)

};

java.util.Arrays.sort(sts, new StudentComparator());

Systhttp://em.out.println(java.util.Arrays.toString(sts));

}

}

以上三种情况,因具体情况的不同,选择不同的方法解决实际的问题。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java用POI解析excel并获取所有单元格数据的实例
下一篇:大华安防综合管理平台接口(大华监控综合管理平台怎么用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~