在Java中有两个比较器:ComparableComparator

对于Integer、Double等等类型,可以直接对他们进行比较,因为已经实现了比较的方式,然而在平时常常会面临需要对集合进行排序的情况,这种情况下我们需要人工定义Java比较器,告诉程序两个对象如何比较大小。

Comparable

Comparable称为内部比较器,因为我们创建需要排序的类还要实现这个类,在创建之初就要人工规定好了排序方式。

实现这个类,然后我们需要重写他的compareTo方法,传递一个类进入,与当前本身类进行比较,返回值是一个int类型。

比较规则是:如果本身 - 传入 > 0,且返回的是正数,那么就是按照升序排列,如果返回的是负数,就是按照降序排列。也可以看成return a-b是升序,return b-a是降序。

如果调用compare方法大于0,就把前一个数和后一个数交换,也就是把大的数放后面了,即所谓的升序了。如果小于等于0,那么就不会交换了。

import java.util.*;
public class Test {
public static void main(String[] args) { MySort m1 = new MySort();
MySort m2 = new MySort();
m1.setId(10);
m2.setId(8); LinkedList<MySort> list = new LinkedList<>();
list.add(m1);
list.add(m2); System.out.println(list.get(0).getId() + " ");
System.out.println(list.get(1).getId());
Collections.sort(list);
System.out.println(list.get(0).getId() + " ");
System.out.println(list.get(1).getId());
} class MySort implements Comparable<MySort> {
private String name;
private int id; public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setId(int id) {
this.id = id;
} public int getId() {
return id;
} @Override
public int compareTo(MySort o) {
// 按照升序排序,低->高
if (id - o.id > 0) {
return 1;
} else if (id - o.id == 0) {
return 0;
} else {
return -1;
}
}
}

Comparator

Comparator称为外部比较器,因为Comparator可以脱离所需要比较的类,比如要对没有实现Comparable的类进行比较,存在List中,这时候如果要排序的话,可以在Collections.sort() 中传入一个Comparator比较器,重写该比较器的compare方法即可。

import java.util.*;
public class Test {
public static void main(String[] args) {
MySort m1 = new MySort();
MySort m2 = new MySort();
m1.setId(10);
m2.setId(8); LinkedList<MySort> list = new LinkedList<>();
list.add(m1);
list.add(m2); System.out.print(list.get(0).getId() + " ");
System.out.println(list.get(1).getId());
Collections.sort(list, new Comparator<MySort>() {
@Override
public int compare(MySort o1, MySort o2) {
if (o1.getId() - o2.getId() > 0) {
return 1;
} else if (o1.getId() - o2.getId() == 0) {
return 0;
} else {
return -1;
}
}
});
System.out.print(list.get(0).getId() + " ");
System.out.println(list.get(1).getId());
}
} class MySort {
private String name;
private int id; public void setName(String name) {
this.name = name;
} public String getName() {
return name;
} public void setId(int id) {
this.id = id;
} public int getId() {
return id;
}
}

Java的比较器Comparable与Comparator的更多相关文章

  1. Java原来如此-比较器(Comparable、Comparator)

    有时候需要对Collection或者不为单一数字的Array进行比较,有两种方法,1是实现Comparable接口,2是实现Comparator接口. 1.ComParable接口 Comparabl ...

  2. Java基础系列-Comparable和Comparator

    原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述         Java中的排序是由Comparable和Comparator这两个接 ...

  3. Java基础之Comparable与Comparator

    Java基础之Comparable与Comparator 一.前言: Java中实现对对象的排序一般情况下主要有以下两种实现方式(万物皆对象嘛): 对象所在的类实现Comparable 接口 定义比较 ...

  4. 比较器comparable与comparator的使用

    在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...

  5. Java学习之Comparable与Comparator的区别

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...

  6. java比较排序Comparable和Comparator

    1       比较排序Comparable和Comparator 1.1      接口作用说明 Comparable和Comparator都是用来实现对象的比较.排序,对比时需要实现Compara ...

  7. 【软件构造】(转)Java中的comparable和comparator

    为了方便阅读和复习,转载至此,原地址:温布利往事的博客 阅读目录 一.Comparable简介 二.Comparator简介 三.Comparable和Comparator区别比较 回到顶部 一.Co ...

  8. Java集合(一)--Comparable和Comparator

    Comparable: 是集合内部的方法实现的排序,只有一个方法 public interface Comparable<T> { public int compareTo(T o); } ...

  9. 比较器Comparable和Comparator

    在java中要实现自定义类的比较,提供了以下两个接口: Comparable(内部排序) int compareTo(Object obj);返回值为int,默认升序排序 Comparator(外部排 ...

随机推荐

  1. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  2. JS的各种数据类型

    Number js与其他编程不一样,不管是整数还是浮点,都称为数字类型(Number) 例:123,1.11111,-960 当该类型结果不存在时,即表示为 NaN (Not a Number) In ...

  3. js一些注意事项

    0.正则表达式,千万不能加引号 1.json对象的key必须用双引号,否则parse时可能出错: json对象不能直接存储时间对象,需要将时间对象加双引号转为字符串,存储,然后对表示时间的属性进行ne ...

  4. revel run报错 undefined: sys call.SIGUSR2"

    revel run报错,报错信息为 o Compilation Error (in ..\\..\\revel\\server_adapter_go.go:135): undefined: sysca ...

  5. Bitmap缩放(三)

    质量压缩 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle ...

  6. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  7. eclipse之SSH配置struts2【一】 (使用版本 2.3.24.1)

    eclipse创建Dynamic web project,勾选生成web.xml,创建index.jsp页面,tomcat部署能正常运行.进行下一步struts配置. web.xml中添加配置,配置在 ...

  8. 需要加强NB-IoT网络优化和终端监管

    NB-IoT解决方案在行业规模商用应用中得到了持续的验证,承受住考验,现在芯片和网络问题和障碍已经得到解决. 从统计结果来看,目前的绝大多数问题都集中在终端侧,因为行业的定制化需求以及合伙伙伴的能力差 ...

  9. 4G工业路由器的信号强度应该怎么保证呢?

    在M2M无线方面,最薄弱的环节是差的间歇性的信号强度.低信号电平导致系统性能差,响应时间慢和可靠性问题.对于系统安装人员和其他4G工业路由器供应商,如何确保最佳的蜂窝信号强度? 检查2G/3G/4G信 ...

  10. pinpoint部署管理

    本次pinpoint安装使用了docker环境安装,需要预先docker运行环境 1.安装docker环境 2.获取pinpoint-docker,安装命令 git clone https://git ...