当前位置:   article > 正文

小记:Comparator & Comparable_comparator item1 item2

comparator item1 item2

Comparator & Comparable

概述

1、都是接口,可实现。
2、都是用于比较、排序。
3、待排序类实现comparable实现排序逻辑,排序逻辑不需要待排序对象本身实现。
4、comparable通过o1.compareTo(Object o2)比较,o1>o2返回正整数,o1=o2返回0,o1<o2返回负整数。comparator通过compare(Object o1,Object o2)比较,o1>o2返回正整数,o1=o2返回0,o1<o2返回负整数。
5、调用方法,comparable:Collections.sort(List),comparator:Collections.sort(List,Comparator)
6、comparable在包java.lang.Comparable下,comparator在包java.util.Comparator下。
7、由于comparable接口需要在待排序对象实现,而comparator可以单独实现,相当于一个外比较器,所以comparable接口的耦合性要强一些,而comparator可以单独实现该接口完成排序比较逻辑的实现,所以是一个比较典型的设计模式中的策略模式。

具体实现

下面是对两种方式的简单举例

public class Compare implements Comparable<Compare> {

    private String name;
    private Integer value;

    @Override
    public int compareTo(Compare o) {
        return o.value - this.value;
    }

    public Compare(String name, Integer value) {
        this.name = name;
        this.value = value;
    }

    public static void main(String[] args) {
        List<Compare> list = new ArrayList<>();
        Compare c1 = new Compare("aa", 1);
        Compare c2 = new Compare("bb", 2);
        list.add(c1);
        list.add(c2);
        c1.compareTo(c2);
        //comparable的方式,需要对象本身实现Comparable接口
        Collections.sort(list);
        //comparator的方式,不需要对象本身实现,可以作为一个单独的逻辑。
        Comparator<Compare> valTmp = new Comparator<Compare>() {
            @Override
            public int compare(Compare o1, Compare o2) {
                return o1.name.compareTo(o2.name);
            }
        };
        //lambda简化表达式
        Comparator<Compare> valTmp1 = (o1, o2) -> o1.name.compareTo(o2.name);
        Collections.sort(list, valTmp);
        Collections.sort(list, valTmp1);

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

map排序

Comparator<Map.Entry<String, Double>> valCmp = (o1, o2) -> {
    // TODO Auto-generated method stub
    return (int) (o2.getValue() * 100 - o1.getValue() * 100);  // 降序排序,如果想升序就反过来
};
//将map转成List,map的一组key,value对应list一个存储空间
List<Map.Entry<String, Double>> list = new ArrayList<>(map.entrySet()); //传入maps实体
Collections.sort(list, valCmp); // 注意此处Collections 是java.util包下面的,传入List和自定义的valCmp比较器
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

扩展-策略模式简述

1、策略模式是一种行为对象模式。
2、策略模式把行为和环境分割开,针对一组算法或者策略,封装到具有公共接口的独立类中,当出现一种新的算法或策略时,只要扩展公共接口就可以。
3、策略模式主要包含环境(Content):抽象策略的引用以及具体策略的交互;抽象策略(Strategy):抽象策略的共同点,一个接口或者抽象类;具体策略(ConcreteStrategy):具体的策略或算法行为。
4、应用场景:java中的comparator类,可以自定义实现比较排序算法策略;促销活动,可以根据不同的活动折扣定义不同的策略算法;
5、如果使用了多个if-else可以考虑采用策略模式实现。
6、优点:避免客户端参杂多个复杂的算法;避免多重if-else语句;易扩展;缺点:判断逻辑在客户端,需求变更,客户端也需要修改;只适合比较扁平的算法结构;客户端选择算法,需要理解所有的算法功能和作用才能选择;

参考文档

https://blog.csdn.net/qq_51165184/article/details/123997917

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/355135
推荐阅读
  

闽ICP备14008679号