我有一个自定义比较器,其比较逻辑如下:
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]。
我无法理解它是如何在内部对方法进行排序的?
答案 0 :(得分:2)
这种比较没有多大意义。
"tendercoupon"
与X
进行比较将始终在"tendercoupon"
X
X
与"tendercoupon"
进行比较将始终在X
"tendercoupon"
"paypal"
与X
进行比较将始终在X
"paypal"
X
与"paypal"
进行比较将始终在"paypal"
X
通过这种奇怪的比较功能,将出现各种奇异的排序结果。
如果您只是尝试按此顺序对项目进行排序:
"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);
}
}
答案 1 :(得分:0)
我宁愿做这样的事情:
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;
}
}
};
因为在您的版本中,即使字符串相等,将“tendercoupon”与“tendercoupon”进行比较也会返回1。