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

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

Java比较器

一、Java比较器

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


二、使用 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 Pandas,从.groupby().Apply()中的GROUP中分割行
查看>>
Python pathlib模块详解:优雅处理文件路径
查看>>
python Path模块的使用 glob iglob name
查看>>
python pickle 模块的使用
查看>>
Python PIL/Pillow-Pad图像至所需大小(例如,A4)
查看>>
python PIL模框使用
查看>>
Python ping 模块
查看>>
Python Pingouin:搞定各种假设检验和统计模型 !
查看>>
Python pip 国内镜像大全及使用办法
查看>>
Python输入输出练习,运算练习,turtle初步练习
查看>>
Python pip工具使用
查看>>
Python pip配置国内源
查看>>
Python Plotly 将轴数格式化为 %
查看>>
Redis 键值过期操作
查看>>
python predictabel_基于R语言PredictABEL包对Logistic回归模型外部验证
查看>>
Python psycopg2 超时
查看>>
Python Pyinstaller Matplotlibrary
查看>>
Python Pypi 修改 国内源(以豆瓣源为例)
查看>>
Python PyQt5 将不再显示此消息复选框添加到 QMessageBox
查看>>
Python PyQt5:如何使用 PyQt5 显示错误消息
查看>>