java - Comparator compare() 如何在内部为下面实现的方法工作?

标签 java

我有一个自定义比较器,其比较逻辑如下:

List<String> l = new ArrayList<String>();
        l.add("tendercoupon");
        l.add("giftcard");
        l.add("creditCard");
        l.add("tendercoupon");
        l.add("giftcard");

        System.out.println(l);
        Comparator<String> PAYMENT_METHODS = new Comparator<String>() {
            @Override
            public int compare(String r1, String r2) {
                if("tendercoupon".equalsIgnoreCase(r1)){
                    return 1;
                }else if("tendercoupon".equalsIgnoreCase(r2)){
                    return -1;
                }if("paypal".equalsIgnoreCase(r1)){
                    return -1;
                }else if("paypal".equalsIgnoreCase(r2)){
                    return 1;
                }else{
                return r1.compareTo(r2);}
            }
        };

        Collections.sort(l, PAYMENT_METHODS);
        System.out.println(l);

此输出为:[creditCard, giftcard, giftcard, tendercoupon, tendercoupon]。

我无法理解它是如何在内部对方法进行排序的?

最佳答案

这种比较没有多大意义。

  • 比较 "tendercoupon"X 将始终在 X
  • 之后排序 "tendercoupon"
  • X"tendercoupon" 进行比较将始终在 "tendercoupon"
  • 之后排序 X
  • "paypal"X 进行比较将始终在 "paypal" 之后排序 X
  • X"paypal" 进行比较将始终在 X
  • 之后排序 "paypal"
  • 其他一切都与常规词汇排序进行比较

这么奇葩的比较函数,会出现各种奇葩的排序结果。

如果您只是想按此顺序对项目进行排序:

"creditcard",
"paypal",
"giftcard",
"tendercoupon"

然后你可以只使用数组的索引来确定相对顺序:

import java.util.*;

class PredefinedOrderingComparator<T> implements Comparator<T> {
    List<T> predefinedOrdering;

    PredefinedOrderingComparator(List<T> predefinedOrdering) {
        this.predefinedOrdering = predefinedOrdering;
    }

    @Override
    public int compare(T t1, T t2) {
        return predefinedOrdering.indexOf(t1) - predefinedOrdering.indexOf(t2);
    }
}

class Main {
    public static void main(String[] args) {
        List<String> l = Arrays.asList(
            "tendercoupon",
            "giftcard",
            "creditCard",
            "tendercoupon",
            "giftcard"
        );
        System.out.println(l);

        Comparator<String> comparator = new PredefinedOrderingComparator(Arrays.asList(
            "creditcard",
            "paypal",
            "giftcard",
            "tendercoupon"
        ));

        Collections.sort(l, comparator);
        System.out.println(l);
    }
}

关于java - Comparator compare() 如何在内部为下面实现的方法工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42619102/

相关文章:

java - 如何使用 ScheduledExecutorService 更改重复任务的速率或周期?

java - ASM 字节码操作 : Measuring method execution speed

java - Axon - 始终重新投影所有事件

java - 理解类成员行为多态性

java - 如何修改此正则表达式在搜索咒语时不区分大小写?

java - Maven增量构建

Java Android - 创建我自己的类

java - 在 Java 中的 JPanel 上显示方法的输出

java - MyEclipse+Hibernate 不按 ID 对属性集排序?

java - PaintComponent 中应该有什么来拖动和旋转图像?