博客
关于我
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/

你可能感兴趣的文章
Objective-C实现haversine distance斜距算法(附完整源码)
查看>>
Objective-C实现heap sort堆排序算法(附完整源码)
查看>>
Objective-C实现heaps algorithm堆算法(附完整源码)
查看>>
Objective-C实现heap堆算法(附完整源码)
查看>>
Objective-C实现Heap堆算法(附完整源码)
查看>>
Objective-C实现hexagonal numbers六边形数算法(附完整源码)
查看>>
Objective-C实现hidden layers neural network浅层神经网络算法(附完整源码)
查看>>
Objective-C实现highest response ratio next高响应比优先调度算法(附完整源码)
查看>>
Objective-C实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)
查看>>
Objective-C实现histogram stretch直方图拉伸算法(附完整源码)
查看>>
Objective-C实现Hopcroft算法(附完整源码)
查看>>
Objective-C实现horizontal projectile motion平抛运动算法(附完整源码)
查看>>
Objective-C实现hornerMethod霍纳法算法(附完整源码)
查看>>
Objective-C实现Horn–Schunck光流算法(附完整源码)
查看>>
Objective-C实现Http Post请求(附完整源码)
查看>>
Objective-C实现http下载文件 (附完整源码)
查看>>
Objective-C实现Http协议下载文件(附完整源码)
查看>>
Objective-C实现huffman哈夫曼编码算法(附完整源码)
查看>>
Objective-C实现ID3贪心算法(附完整源码)
查看>>
Objective-C实现IIR 滤波器算法(附完整源码)
查看>>