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

 更新时间:2017年10月07日 10:02:09   作者:danmoqianhua  
下面小编就为大家带来一篇浅谈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<BookCook>{
	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<Student> {
	@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());
		System.out.println(java.util.Arrays.toString(sts));
	}
}

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

这篇浅谈Java中几种常见的比较器的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mybatis注解动态sql注入map和list方式(防sql注入攻击)

    mybatis注解动态sql注入map和list方式(防sql注入攻击)

    这篇文章主要介绍了mybatis注解动态sql注入map和list方式(防sql注入攻击),具有很好的参考价值,希望对大家有所帮助。
    2021-11-11
  • MyBatis图文并茂讲解注解开发一对一查询

    MyBatis图文并茂讲解注解开发一对一查询

    这篇文章主要介绍了SpringBoot中Mybatis注解一对一查询的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 使用Java实现简单搭建内网穿透

    使用Java实现简单搭建内网穿透

    内网穿透是一种网络技术,适用于需要远程访问本地部署服务的场景,本文主要为大家介绍了如何使用Java实现简单搭建内网穿透,感兴趣的可以了解下
    2024-02-02
  • 如何通过Java实现修改视频分辨率

    如何通过Java实现修改视频分辨率

    Java除了可以修改图片的分辨率,还可以实现修改视频的分辨率,这篇文章就将带大家学习如果编写这一工具类,感兴趣的同学可以了解一下
    2021-12-12
  • SpringBoot实现发送QQ邮件的示例代码

    SpringBoot实现发送QQ邮件的示例代码

    这篇文章主要介绍了SpringBoot如何实现发送QQ邮件功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Mybatis Plus代码生成器(时间管理大师)

    Mybatis Plus代码生成器(时间管理大师)

    这篇文章主要介绍了Mybatis Plus代码生成器(时间管理大师)的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • java组件commons-fileupload实现文件上传

    java组件commons-fileupload实现文件上传

    这篇文章主要介绍了java借助commons-fileupload组件实现文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Java如何处理json字符串value多余双引号

    Java如何处理json字符串value多余双引号

    这篇文章主要介绍了Java如何处理json字符串value多余双引号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解Java函数式编程和lambda表达式

    详解Java函数式编程和lambda表达式

    这篇文章主要介绍了Java函数式编程和lambda表达式,对lambda感兴趣的同学,一定要看一下
    2021-04-04
  • 详解java为什么不允许类多重继承却允许接口多重继承

    详解java为什么不允许类多重继承却允许接口多重继承

    这篇文章主要介绍了java为什么不允许类多重继承却允许接口多重继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论