Java中常见的比较器的实现方法
在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
通常对象之间的比较可以从两个方面去看:
第一个方面:对象的地址是否一样,也就是是否引用自同一个对象。这种方式可以直接使用“==“来完成。
第二个方面:以对象的某一个属性的角度去比较。
对于JDK8而言,有三种实现对象比较的方法:
1、覆写Object类的equals()方法;
2、继承Comparable接口,并实现compareTo()方法;
3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
由于使用的排序方式的不同,具体选择哪种方法来实现对象的比较也会有所不同。
第一种方法比较便于理解,复写equals()方法一般用于自己实现的对象数组排序,而对于在应用Java内置的排序算法时,使用后两种方式都是可以实现的。
先来看一下第二种方式,这种方式就是让自己编写的类继承Comparable接口,并实现接口的compareTo()方法,这种情况下,在使用java.util.Arrays.sort()方法时不用指定具体的比较器,sort()方法会使用对象自己的比较函数对对象进行排序。具体实例代码如下:
1 import java.util.Arrays;
2
3 class BookCook implements Comparable<BookCook>{
4 private String title;
5 private double price;
6 public BookCook(String title,double price){
7 this.title = title;
8 this.price = price;
9 }
10 @Override
11 public String toString() {
12 return "书名:"+this.title+",价格:"+this.price;
13 }
14 @Override
15 public int compareTo(BookCook o) {
16 if(this.price > o.price){
17 return 1;
18 }else if(this.price < o.price){
19 return -1;
20 }else{
21 return 0;
22 }
23 }
24 }
从JDK1.8开始出现了Comparator接口,它的出现解决了当需要在已经开发好的代码基础上完善对象的比较功能时不想更改之前的代码的问题。这种情况,我们需要单独定义一个对象比较器,继承Comparator接口。具体实现代码如下:
1 class Student {
2 private String name;
3 private double score;
4 public Student(String name,double score){
5 this.name = name;
6 this.score = score;
7 }
8 public double getScore(){
9 return this.score;
10 }
11 @Override
12 public String toString() {
13 return "姓名:"+this.name+",分数:"+this.score;
14 }
15
16 }
17 class StudentComparator implements Comparator<Student> {
18 @Override
19 public int compare(Student o1,Student o2) {
20 if(o1.getScore() > o2.getScore()){
21 return 1;
22 }else if(o1.getScore() < o2.getScore()){
23 return -1;
24 }else{
25 return 0;
26 }
27 }
28 }
29 public class TestComparator {
30
31 public static void main(String[] args) {
32
33 Student[] sts = new Student[]{
34 new Student("小戴",60),
35 new Student("小王",90),
36 new Student("老王",80),
37 new Student("小萱",95)
38 };
39
40 java.util.Arrays.sort(sts, new StudentComparator());
41 System.out.println(java.util.Arrays.toString(sts));
42 }
43 }
以上三种情况,因具体情况的不同,选择不同的方法解决实际的问题。
Java中常见的比较器的实现方法的更多相关文章
- Java中常见编码格式及乱码解决方法
一:设置编码格式 1.JSP文件 charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为"UTF-8",pageEncoding="UTF-8" ...
- Java中常见方法详解合集(方法的定义及语法结构)
Java的方法定义 1.方法的定义 方法是控制对象的动作行为方式与准则,在Java中方法位于类体下又有另一种含义. 普通的方法在类中称为"实例方法",因为方法的调用需要创建对象,而 ...
- java中遍历map对象的多种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有ma ...
- Java中常见的5种WEB服务器介绍
这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...
- Java中遍历map的四种方法 - 转载
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- Java中常见的注解
Java中常见的注解 1.JDK自带的注解@Override @Deprecated @Suppvisewarnings 常见第三方注解 Spring:@Autowired @Service ...
- Java中常见的异常类型
一. Java中常见的异常类 异常类 说明 ClassCastException 类型准换异常 ClassNotFoundException 未找到相应类异常 ArithmeticException ...
- java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- java中获取日期和时间的方法总结
1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下: 要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...
随机推荐
- Map.Entry<K,V>分析
一.好处 你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦? Set keys = map.keySet( ); if(keys != null) { Iterator iterator ...
- DOM 属性操作
1 属性节点 2 attribute操作 3 value获取值操作 4 class的操作 5 指定CSS操作 1.属性节点 //获取文本节点的值 var divEle = document.getEl ...
- Android学习笔记之AndroidManifest.xml文件解析(详解)
一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...
- Zookeeper配置说明
转载自:https://my.oschina.net/u/2338362/blog/399361 Zookeeper的安装和配置十分简单, 既可以配置成单机模式, 也可以配置成集群模式. 下面将分别进 ...
- spring boot 2.0添加对fastjson的支持
首先引入fastjson的maven依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId&g ...
- Oracle11g用户频繁锁定并且解锁后不允许登录
原因有可能是oracle的密码过期机制导致的:一.由于Oracle中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致.解决办法:1.查看用户用的哪种prof ...
- ubuntu安装java jdk
openjdk安装http://openjdk.java.net/install/ 一.下载 首先,当然是要下载了. 地址:http://www.oracle.com/technetwork/java ...
- 前端之 JQuery
一.基本选择器 1.#id 概述: 根据给定的ID匹配一个元素. 使用任何的元字符(如 !"#$%&'()*+,./:;<=>?@[\]^`{|}~)作为名称的文本部分, ...
- 013_HDFS文件合并上传putmarge功能(类似于hadoop fs -getmerge)
场景 合并小文件,存放到HDFS上.例如,当需要分析来自许多服务器的Apache日志时,各个日志文件可能比较小,然而Hadoop更合适处理大文件,效率会更高,此时就需要合并分散的文件.如果先将所有文件 ...
- Ubuntu中输入输出重定向及管道技术简述
输出 1.标准输出 定义:程序在默认情况下输出结果的地方(stdout). 2.输出重定向 定义:用于把数据的输出转移到另一个地方去. 3.Ubuntu中例子 $ls > ~/ls_out # ...