首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于下面实现的方法,比较器比较()是如何在内部工作的?

对于下面实现的方法,比较器比较()是如何在内部工作的?
EN

Stack Overflow用户
提问于 2017-03-06 06:41:45
回答 2查看 1.1K关注 0票数 1

我有一个具有比较逻辑的自定义比较器,如下所示:

代码语言:javascript
运行
复制
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,礼品卡,礼品卡,投标券,优惠券。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-06 06:47:27

这种比较没有多大意义。

  • "tendercoupon"X进行比较总是会在X之后对"tendercoupon"进行排序
  • X"tendercoupon"进行比较总是会在"tendercoupon"之后对X进行排序
  • "paypal"X进行比较总是会在"paypal"之后对X进行排序
  • X"paypal"进行比较总是会在X之后对"paypal"进行排序
  • 其他一切都与常规词法排序进行了比较。

有了这样一个奇异的比较函数,就会出现各种奇怪的排序结果。

如果您只是试图在此顺序中对项目进行排序:

代码语言:javascript
运行
复制
"creditcard",
"paypal",
"giftcard",
"tendercoupon"

然后,只需使用数组的索引来确定相对顺序:

代码语言:javascript
运行
复制
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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2017-03-06 07:18:40

我宁愿这样做:

代码语言:javascript
运行
复制
    Comparator<String> PAYMENT_METHODS = new Comparator<String>() {
        @Override
        public int compare(String r1, String r2) {
            int result = r1.compareTo(r2);
            if (result == 0) {
                return 0;
            } else if("tendercoupon".equalsIgnoreCase(r1)){
                return 1;
            } else if("tendercoupon".equalsIgnoreCase(r2)){
                return -1;
            } else if("paypal".equalsIgnoreCase(r1)){
                return -1;
            } else if("paypal".equalsIgnoreCase(r2)){
                return 1;
            } else {
                return result;
            }
        }
    };

因为在您的版本中,即使字符串是相等的,将“投标券”和“投标券”进行比较也会返回1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42619102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档