Java实现Comparable接口(重写compareTo方法)和Comparator接口(重写compare方法)

Compareable接口和Comparator接口

实体类: java.lang.Comparable(接口)+compareTo(重写方法)
业务类:java.util.Comparator(接口) +compare(重写方法)

两个接口分别对应的业务实现

在实际的需求中,我们根据对象的各种属性(标题,时间,点击率,销售额。。。)进行排序(升序,降序),可以做哎数据库的sql上进行处理,但是不是每一个场景都适合在sql上进行处理,我们有时候需要在程序根据不同的属性,对一个对象进行各种排序通过页面呈现给用户。

一、Comparable接口+compareTo方法 的应用场景

下面有这样的一个需求,一种商品(商品名,销售量,生产日期),根据生产日期降序 销售量升序 商品名称降序

思路:首先按照日期降序,如果日期相同 按照销售量升序,如果销售量相同,按周商品的名称降序。

  1. 创建类实现Comparable接口(注意有泛型),重写compareTo方法
/**
 * 商品po类
 */
public class Items implements java.lang.Comparable<Items> {
    private String title;
    private int hits;
    private Date pubTime;
    public Items() {}
    public Items(String title, int hits, Date pubTime) {
        super();
        this.title = title;
        this.hits = hits;
        this.pubTime = pubTime;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public int getHits() {
        return hits;
    }
    public void setHits(int hits) {
        this.hits = hits;
    }
    public Date getPubTime() {
        return pubTime;
    }
    public void setPubTime(Date pubTime) {
        this.pubTime = pubTime;
    }
    //时间降序 点击量升序 标题降序
    @Override
    public int compareTo(Items o) {
        int result = 0;
        //按照生产时间降序
        result = - this.pubTime.compareTo(o.pubTime);
        if(0==result){//如果生产时间相同 就按照销售量升序排列
            result = this.hits-o.hits;
            if(0==result){//如果销售量相同 按照名字降序排列
                result = - this.title.compareTo(o.title);
            }
        }
        return result;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("商品名称").append(this.title);
        sb.append("销售量").append(this.hits);
        sb.append("生产时间").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.pubTime)).append("\n");
        return sb.toString();
    }
  }
  1. 造数据,进行比较
    注意:最后排序还是要调用Collenctions.sort(item) 方法进行排序
//时间降序, 销售量升序, 标题降序
public static void main(String[] args) {
      List<Items> item 
              = new ArrayList<Items>();
      item.add(new Items("abcitems"
              ,30,new Date(System.currentTimeMillis()-1000*60*60)));
      item.add(new Items("abcfgitems"
               ,30,new Date(System.currentTimeMillis()-1000*60*50)));
      item.add(new Items("abcditems"
               ,100,new Date()));
      item.add(new Items("abefNews"
              ,50,new Date(System.currentTimeMillis()-1000*60*60)));
      System.out.println("----------排序前----------");
      System.out.println(item);
      System.out.println("----------排序后----------");
      Collections.sort(item);
      System.out.println(item);
}

二,Comparator接口 + compare方法 的应用场景

一般比较字符串是按照unicode的大小进行排序的,但是我需要按照字符串的长度进行排序,下面是实现的案例:
首先,定义比较的业务规则

/**
 * 定义业务的比较规则,我需要按照字符串的长度进行比较(在实际的场景中,可以根据业务的需求,灵活的改变比较规则,实现排序)
 */
public class CompareString implements java.util.Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();
        return -(len1-len2);//需要按照降序排列
    }
}

比较字符串的长度,按照降序排列
注意:最后排序还是调用Collections.sort(list, new CompareString()方法

public static void main(String[] args) {
        List<String>  list 
                = new ArrayList<String>();
       list.add("abc");
       list.add("abcd");
       list.add("ab");
       list.add("abd");
       Collections.sort(list,new CompareString());
       System.out.println(list);
     //[abcd, abc, abd, ab]
    }

三、对比

  • comparable接口是默认嵌套在实现类里面,当我们调用Collections.sort(list)方法会自动调用重写的compareTo方法。
  • comparator接口是类似工具类,提前在外面定义一个工具类实现comparator接口,并重写compare方法。当我们需要排序时,调用该工具类,通过 Collections.sort(list, 工具类对象)的方式调用。
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,比较器可以通过重写 `compare` 方法和 `compareTo` 方法实现。这两个方法都可以用来比较两个对象的大小。 `compare` 方法: `compare` 方法是在比较器类中实现的,它接收两个参数,这两个参数可以是任何对象,并返回一个整数值。如果第一个参数小于第二个参数,返回一个负整数;如果第一个参数等于第二个参数,返回0;如果第一个参数大于第二个参数,返回一个正整数。例如: ```java public class MyComparator implements Comparator<MyClass> { @Override public int compare(MyClass o1, MyClass o2) { // 比较逻辑 return 0; } } ``` `compareTo` 方法: `compareTo` 方法是在实现 `Comparable<T>` 接口的类中实现的,它只接收一个参数,这个参数是要比较的对象,并返回一个整数值。如果当前对象小于传入的对象,返回一个负整数;如果当前对象等于传入的对象,返回0;如果当前对象大于传入的对象,返回一个正整数。例如: ```java public class MyClass implements Comparable<MyClass> { @Override public int compareTo(MyClass o) { // 比较逻辑 return 0; } } ``` 需要注意的是,如果一个类实现了 `Comparable<T>` 接口,那么它的对象可以使用 `Collections.sort` 方法进行排序,并且如果要使用自定义的比较器,可以通过 `Collections.sort` 方法的另一个重载方法来指定。例如: ```java List<MyClass> list = new ArrayList<>(); // 添加元素 Collections.sort(list); // 使用 compareTo 方法进行排序 Collections.sort(list, new MyComparator()); // 使用自定义比较器进行排序 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值