Java比较器

前言

本篇文章主要介绍的是Java比较器的实现与测试。

1.java.lang.Comparable排序接口
定义:

Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

Comparable接口中的方法:
接口中的方法说明
int compareTo(T t)比较当前对象与传入进来对象的大小
参数:t 表示要比较的对象,返回值:如果当前的对象大于t,返回正整数。如果当前的对象等于t,返回0。如果当前对象小于t,返回负整数

这是Java的一种约定,当排序的sort()方法在对集合中的元素两两进行比较的时候会调用我们实现的compareTo(T t)方法。如果compareTo()返回正整数,则表示当前元素大于和它比较的元素;如果返回负整数则表示当前元素小于和它比较的元素;如果返回0,则表示两者相等。

案例
//实体类实现Comparable接口
@Data
public class Record implements Comparable<Record> {
    private String name;
    private int num;

    public Record(String name,int num) {
        this.name = name;
        this.num = num;
    }
	@Override
    public String toString() {
        return "("+name+","+num+")";
    }
	
	//重写compareTo方法,方法内定义排序规则
    @Override
    public int compareTo(Record r) {
		//1.name属性字符串类型比较unicode值
		return this.name.compareTo(r.name)------------
		//2.price属性数值类型比较大小
		if(this.num > r.num){
            return 1;
        }else if(this.num < r.num){
            return -1;
        }else{
            return 0;
        }
------------
		//3.price属性数值类型比较大小
		return this.num - r.num;
------------
		//4.price属性包装类比较大小
		return Integer.compare(this.num, r.getNum());
------------
		//5.name属性字符串类型按照拼音字母进行排序
        return Collator.getInstance(Locale.CHINA).compare(this.name,r.name);
    }
}

针对最后一种排序规则,jdk自带的Collator包涵的汉字太少了,对一些生僻的姓氏不能进行排序。Collator推荐使用:import com.ibm.icu.text.Collator;
pom依赖:

<dependency>
	<groupId>com.ibm.icu</groupId>
	<artifactId>icu4j</artifactId>
	<version>57.1</version>
</dependency>
测试:
 	@Test
    public void test2() {
        ArrayList<Record> list = new ArrayList<>();
		//添加元素到list
        Collections.addAll(list,
        new Record("日本",1),
        new Record("印尼",4),
        new Record("菲律宾",2),
        new Record("中国",5),
        new Record("中国香港",3),
        new Record("斐济",6));
		//排序前输出
		System.out.println(list);
		//[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)]
        //排序
        Collections.sort(list);
		//排序后输出
		System.out.println(list);
		//1.[(中国,5), (中国香港,3), (印尼,4), (斐济,6), (日本,1), (菲律宾,2)]
		//2、3、4.[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)]
		//5.[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)]
    }
2.java.util.Comparator比较器接口
定义:

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

Comparable接口中的方法:
接口中的方法说明
int compare(T t1, T t2)比较t1和t2这两个对象,如果:t1 > t2,这个方法返回正整数;t2 == t1,返回0;t1 < t2,这个方法返回负整数
案例
//创建实体类
@Data
public class Record{
    private String name;
    private int num;

    public Record(String name,int num) {
        this.name = name;
        this.num = num;
    }

    @Override
    public String toString() {
        return "("+name+","+num+")";
    }
}
//测试
public class Demo {
    @Test
    public void test() {
        List<Record> list = new ArrayList<>();
        Collections.addAll(list,
        new Record("日本",1),
        new Record("印尼",4),
        new Record("菲律宾",2),
        new Record("中国",5),
        new Record("中国香港",3),
        new Record("斐济",6));
        System.out.println(list);
		//使用比较器中的排序规则进行排序
        Collections.sort(list,new NameComparator());
        System.out.println(list);
		Collections.sort(list,new NumComparator());
        System.out.println(list);
		//以上输出
		//[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)]
		//[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)]
		//[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)]
    }
}

//名称比较器,按汉字拼音顺序
class NameComparator implements Comparator<Record> {
    @Override
    public int compare(Record r1, Record r2) {
        return Collator.getInstance(Locale.CHINA).compare(r1.getName(),r2.getName());
    }
}
//数字比较器,按大小
class NumComparator implements Comparator<Record> {
    @Override
    public int compare(Record r1, Record r2) {
        return r1.getNum() - r2.getNum();
    }
}

使用匿名内部类形式实现Comparator接口

public class Demo {
    @Test
    public void test() {
        List<Record> list = new ArrayList<>();
        Collections.addAll(list,
        new Record("日本",1),
        new Record("印尼",4),
        new Record("菲律宾",2),
        new Record("中国",5),
        new Record("中国香港",3),
        new Record("斐济",6));
        System.out.println(list);
        Collections.sort(list, new Comparator<Record>() {
            @Override
            public int compare(Record r1, Record r2) {
                return Collator.getInstance(Locale.CHINA).compare(r1.getName(),r2.getName());
            }
        });
        System.out.println(list);
		//使用比较器中的排序规则进行排序
        Collections.sort(list, new Comparator<Record>() {
            @Override
            public int compare(Record r1, Record r2) {
                return r1.getNum()-r2.getNum();
            }
        });
        System.out.println(list);
		//以上输出
		//[(日本,1), (印尼,4), (菲律宾,2), (中国,5), (中国香港,3), (斐济,6)]
		//[(菲律宾,2), (斐济,6), (日本,1), (印尼,4), (中国,5), (中国香港,3)]
		//[(日本,1), (菲律宾,2), (中国香港,3), (印尼,4), (中国,5), (斐济,6)]
    }
}
3.Comparable和Comparator区别比较

Comparable 和 Comparator 都是用来实现集合中的排序的,只是 Comparable 是在对象内部定义的方法实现的排序,Comparator 是在集合外部实现的排序。

1.Comparable位于包java.lang下,Comparator位于包java.util下。Comparable接口将比较代码嵌入自身类中,而Comparable在一个独立的类中实现比较。

2.如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过Comparator 来实现比较算法进行排序。

3.Comparator为了使用不同的排序规则做准备。比如:升序、降序或按不同的属性进行排序。

4.注

字符串比较的规则:
从字符串的第1个字符开始比较大小,比较它们的ASCII码值。如果第1个字符相等,则比较第2个字符。依次类推,直到比较出大小为止。
如果是汉字,则比较Unicode值。

CSDN:https://blog.csdn.net/qq_27682773
简书:https://www.jianshu.com/u/e99381e6886e
博客园:https://www.cnblogs.com/lixianguo
个人博客:https://www.lxgblog.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,Comparator是一个接口,它定义了一个用于比较两个对象的方法compare(Object o1, Object o2)。Comparator接口通常用于对集合中的元素进行排序。 Comparator接口中的compare方法返回一个int值,表示两个对象的相对顺序。如果第一个对象小于第二个对象,则返回负数;如果第一个对象等于第二个对象,则返回0;如果第一个对象大于第二个对象,则返回正数。 Comparator接口的实现类可以使用匿名内部类、Lambda表达式或单独的类来创建。在比较两个对象时,可以使用任何属性或方法来定义它们之间的关系。 下面是一个使用Comparator接口对字符串进行排序的例子: ``` List<String> strings = Arrays.asList("apple", "orange", "banana", "pear"); Collections.sort(strings, new Comparator<String>() { public int compare(String s1, String s2) { return s1.compareTo(s2); } }); ``` 这个例子中,我们创建了一个字符串列表,并使用Collections.sort方法将其排序。我们使用了一个匿名内部类来实现Comparator接口,将字符串按字典序排序。 在Java中,比较器的顺序是根据返回值来确定的。如果compare方法返回负数,则第一个对象在第二个对象之前;如果compare方法返回正数,则第一个对象在第二个对象之后;如果compare方法返回0,则两个对象相等,它们的相对位置不变。 比较器的实现通常需要考虑到多个因素,例如按照价格排序时可能需要同时考虑产品的名称、品牌、型号等因素。在这种情况下,我们可以使用Java 8中引入的多字段排序方法,或者创建一个自定义比较器来实现排序。 总之,Comparator是Java中非常重要的一个接口,它提供了一种灵活的方法来对集合中的对象进行排序。熟练掌握Comparator接口的使用方法可以让我们更好地处理集合数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值