博客
关于我
Java比较器
阅读量:183 次
发布时间:2019-02-28

本文共 3732 字,大约阅读时间需要 12 分钟。

Java比较器

一、Java比较器

在Java中,对象的比较通常只能使用 == 或 !=。然而,在实际开发中,我们常常需要对多个对象进行排序。这就需要使用 Comparable 或 Comparator 接口。


二、使用 Comparable 接口进行自然排序

Comparable 接口是一个自然比较接口,常见的实现类包括 String 和包装类。通过实现 Comparable 接口并重写 compareTo 方法,我们可以定义对象的比较逻辑。

compareTo 方法的规则
  • 如果当前对象 this 大于形参对象 obj,返回 正整数。
  • 如果当前对象 this 小于形参对象 obj,返回 负整数。
  • 如果当前对象 this 等于形参对象 obj,返回 零。
compareTo 方法示例

以下是 String 类的 compareTo 方法源码:

public int compareTo(String anotherString) {    int len1 = value.length;    int len2 = anotherString.value.length;    int lim = Math.min(len1, len2);    char v1[] = value;    char v2[] = anotherString.value;    int k = 0;    while (k < lim) {        char c1 = v1[k];        char c2 = v2[k];        if (c1 != c2) {            return c1 - c2; // 小于返回负数,大于返回正数        }        k++;    }    return len1 - len2;}
自定义类排序示例

对于自定义类,例如 GoodsTest,如果需要根据 price 属性排序,可以实现 Comparable 接口并重写 compareTo 方法:

public class GoodsTest implements Comparable {    private String name;    private double price;    public GoodsTest(String name, double price) {        this.name = name;        this.price = price;    }    @Override    public int compareTo(Object o) {        if (o instanceof GoodsTest) {            GoodsTest good = (GoodsTest) o;            if (this.price > good.price) {                return 1;            } else if (this.price < good.price) {                return -1;            } else {                return 0;            }        }        throw new RuntimeException("传入的数据类型不一致!");    }}
排序示例
@Testpublic void test2() {    GoodsTest[] arr = new GoodsTest[4];    arr[0] = new GoodsTest("商品1", 22);    arr[1] = new GoodsTest("商品2", 154);    arr[2] = new GoodsTest("商品3", 67);    arr[3] = new GoodsTest("商品4", 88);    Arrays.sort(arr);    System.out.println(Arrays.toString(arr));    // 输出结果:[GoodsTest{name='商品1', price=22.0}, GoodsTest{name='商品3', price=67.0}, GoodsTest{name='商品4', price=88.0}, GoodsTest{name='商品2', price=154.0}]}

三、使用 Comparator 接口进行定制排序

当对象没有实现 Comparable 接口或者现有的比较逻辑不适合当前需求时,可以使用 Comparator 接口进行定制排序。通过重写 compare 方法,可以自定义比较逻辑。

字符串从大到小排序示例
@Testpublic void test3() {    String[] arr = new String[]{"AA", "CC", "MM", "DD", "GG", "BB"};    Arrays.sort(arr, new Comparator
() { @Override public int compare(String o1, String o2) { if (o1 instanceof String && o2 instanceof String) { String s1 = (String) o1; String s2 = (String) o2; return -s1.compareTo(s2); // compareTo默认从小到大,加负号从大到小 } throw new RuntimeException("输入的类型不一致!"); } }); System.out.println(Arrays.toString(arr)); // 输出结果:[MM, GG, DD, CC, BB, AA]}
商品排序示例
@Testpublic void test4() {    GoodsTest[] arr = new GoodsTest[4];    arr[0] = new GoodsTest("商品1", 22);    arr[1] = new GoodsTest("商品2", 154);    arr[2] = new GoodsTest("商品3", 67);    arr[3] = new GoodsTest("商品4", 88);    Arrays.sort(arr, new Comparator
() { @Override public int compare(GoodsTest o1, GoodsTest o2) { if (o1 instanceof GoodsTest && o2 instanceof GoodsTest) { GoodsTest g1 = (GoodsTest) o1; GoodsTest g2 = (GoodsTest) o2; if (g1.getName().equals(g2.getName())) { return -Double.compare(g1.getPrice(), g2.getPrice()); } else { return g1.getName().compareTo(g2.getName()); } } throw new RuntimeException("输入的数据类型不一致"); } }); System.out.println(Arrays.toString(arr)); // 输出结果:[GoodsTest{name='商品1', price=22.0}, GoodsTest{name='商品2', price=154.0}, GoodsTest{name='商品3', price=67.0}, GoodsTest{name='商品4', price=88.0}]}

两种排序方式对比

  • Comparable 接口:一旦实现,类的对象在任何位置都可以比较大小,适合自然排序。
  • Comparator 接口:属于临时性的比较,适合定制排序需求。

转载地址:http://bnpi.baihongyu.com/

你可能感兴趣的文章
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>
python+flask计算机毕业设计骨科门诊患者档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体测管理系统的设计与实现(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校体育赛事系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校危化品管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校教学档案管理系统(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校教学督导平台(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校校内景点平台(程序+开题+论文)
查看>>
python+flask计算机毕业设计高校校园线上跳蚤市场的系统设计(程序+开题+论文)
查看>>