我有一个自定义比较器,其比较逻辑如下:
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
之后排序 - 将
X
与"tendercoupon"
进行比较将始终在"tendercoupon"
之后排序 - 将
"paypal"
与X
进行比较将始终在"paypal"
之后排序X
- 将
X
与"paypal"
进行比较将始终在X
之后排序 - 其他一切都与常规词汇排序进行比较
"tendercoupon"
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/