Java比较器

一.Java比较器的概述

1.为什么要使用比较器?

当java涉及到数组排序时,就会使用到比较器

import java.util.Arrays;
​
public class ComparableTest1 {
​
    public static void main(String[] args) {
        
        String [] arr = {"AA","FF","SS","BB","DD","CC"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

2.实现排序的两种方式:

①自然排序:java.lang.Comparable

②定制排序: java.util.Comparator

3.说明:

java对象中,正常情况下只能进行 == 或 !=比较,不能使用 < 或 > 进行比较,但在实际中,需对多个对象排序,,言外之意就是比较大小,所以这时候就无法满足我们的要求

如何实现?

使用两个接口中的任意一个;

      Comparable或Comparator

一.Conparable接口使用举例

1.像String,包装类等都实现了Comparable接口,重写了CompareTo(obj)方法,给出了比较两个对象大小的方式

2.重写CompareTo(obj)规则:

  • 如果当前对象的this大于形参对象的obj,则返回正整数

  • 如当前对象的的this小于形参对象的obj,则返回负整数

  • 如果当前对象的this等于形参对象的obj,则返回0

3.对于自定义类,如果需要排序,可使自定义类实现Comparable接口,重写CompareTo

()方法,并指明需要如何排序

public int CompareTo(Object o){
        if (o instanceof Goods){    //判断o是否是Goods的实例
           Goods goods = (Goods)o;
           if(((Goods) o).price>goods.price){
               return 1;
           } else if (((Goods) o).price<goods.price){
               return -1;
           } else if (((Goods) o).price==goods.price){
                return 0;
           }
           throw new RuntimeException("输入类型不一致!");
        }
    }

二.Comparator定制排序方法

1.当元素类型没有实现java.lang.Comparable接口,而又不方便修改代码,或者实现了Comparable接口,但给定的排序规则不符合当前所需操作,这时我们就可以考虑实现Comparator接口,从而实现强制对多个对象进行排序操作

2.重写CompareTo(obj1 ,obj 2)方法,比较o1和o2,如果返回值时正数,则o1>o2;如果返回值为负数,则o1<o2;如果返回值为0,则o1==o2

3.可以将Comparator传递给sort()方法(如Collection.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制

4.Comparator实现的栗子:

import java.util.Arrays;
import java.util.Comparator;
​
public class ComparatorTest {
​
    public static void main(String[] args) {
​
        String [] arr = new String[]{"AA","CC","GG","BB","DD"};
​
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1 instanceof String && o2 instanceof String){    //判断o1及o2是否为String类型
                    String s1 = (String)o1;
                    String s2 = (String)o2;
                    return -s1.compareTo(s2);  //调用compareTo方法比较元素大小,添加负号表明为从大到小排序
                }
                throw new RuntimeException("输入不一致!");
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}

三.两种实现方式的对比:

  • comparator接口方式一旦给定,把保证Comparable接口实现类的对象在任何位置都可以比较大小

  • comparator接口属于临时比较器

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会写代码的菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值