(8)Java 中常见的比较器用法

前言:

在开发过程中,我们经常会涉及到对象比较的问题,今天就来总结一下对象比较的几种方式,一起随小编往下看吧!

对于JDK1.8而言,有3种实现对象比较的方法:

1、覆写Object类的equals()方法;

2、继承Comparable接口,并实现compareTo()方法;

3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。

面试题:

试比较Comparable 和Comparator 的区别?

  1. 如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器
  2. 对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等
  3. 对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现
     

Comparable的用法:

package com.test.model;

import io.swagger.annotations.ApiModelProperty;

/**
 * @Author tanghh
 * @Date 2020/3/8 9:24
 * 商品类
 */
public class Product implements Comparable<Product> {
    @ApiModelProperty(value = "id")
    private int id;
    @ApiModelProperty(value = "商品数量")
    private int count;
    @ApiModelProperty(value = "商品名称")
    private String productName;

    public Product(int id, int count, String productName) {
        this.id = id;
        this.count = count;
        this.productName = productName;
    }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", count=" + count +
                ", productName='" + productName + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    @Override
    public int compareTo(Product o) {
        //升序
        int i = this.getCount() - o.getCount();
        //降序
        //int i = o.getCount() - this.getCount();
        return i;
    }
}

 

降序的代码:

package com.test.model;

import io.swagger.annotations.ApiModelProperty;

/**
 * @Author tanghh
 * @Date 2020/3/8 9:24
 * 商品类
 */
public class Product implements Comparable<Product> {
    @ApiModelProperty(value = "id")
    private int id;
    @ApiModelProperty(value = "商品数量")
    private int count;
    @ApiModelProperty(value = "商品名称")
    private String productName;

    public Product(int id, int count, String productName) {
        this.id = id;
        this.count = count;
        this.productName = productName;
    }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", count=" + count +
                ", productName='" + productName + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    @Override
    public int compareTo(Product o) {
        //升序
        //int i = this.getCount() - o.getCount();
        //降序
      int i = o.getCount() - this.getCount();
        return i;
    }
}

测试类:

package com.test.nodefault;

import com.test.model.Product;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/3/8 9:30
 * 测试类
 */
public class ProductTest {
    public static void main(String[]args){
        //第一种方式: 定义一个List集合,向集合中商品对象,使用比较器将内容排序输出
        List<Product> list1 = new ArrayList<>();

        list1.add(new Product(1,1000,"旺仔牛奶"));

        list1.add(new Product(2,222,"保温杯"));

        list1.add(new Product(3,333,"按摩机"));

        list1.add(new Product(4,444,"养生壶"));

        list1.add(new Product(5,6666,"码出高效Java开发手册"));

        Collections.sort(list1);

        for (Product product : list1) {
            System.out.println("值为:----"+product);
        }

     
    }
}

升序的结果:

降序的结果:

Comparator的用法:

适用场景: 如果我们需要对一个类进行排序,但是这个类没有实现Comparable  接口,那么我们就可以写一个“比较器”。

compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

package com.test.nodefault;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @Author tanghh
 * @Date 2020/3/8 9:42
 * Comparator的用法
 */
public class ComparatorTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("aaaaa");
        list.add("bbbbb");
        list.add("ccccc");
        Collections.sort(list, new Comparator<String>() {
            public int compare(String str1, String str2) {
               //1: 按首字母升序【升序排的话就是第一个参数.compareTo(第二个参数)】
//               return str1.compareTo(str2);
               //2:按照首字母降序 降序排的话就是第二个参数.compareTo(第一个参数);
//                return str2.compareTo(str1);
               //3:按照第二字母升序
//                char c1 = str1.charAt(1);
//                char c2 = str2.charAt(1);
//                return c1 - c2;
                //4.按照第二字母升序
                char c1 = str1.charAt(1);
                char c2 = str2.charAt(1);
                return c2 - c1;
            }
        });
        System.out.println(list);
    }
}

总结:

1.Comparable 类是java.lang包下,里面就一个方法。

public int compareTo(T o);

2.Comparator 类是 java.util包下,里面有很多方法。下面列出一俩个,还有一些没列举出来。

int compare(T o1, T o2);
boolean equals(Object obj);

3. 一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)。

   一个类实现Comparable ,就可以自然排序。

好文章

https://www.cnblogs.com/ldy-blogs/p/8488138.html

https://blog.csdn.net/wo8vqj68/article/details/81164163

https://www.cnblogs.com/learnapi/p/9003112.html

https://blog.csdn.net/qing_gee/article/details/103884684

发布了60 篇原创文章 · 获赞 49 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/104727222