2017-03-06 63 views
1

我有如下的比較邏輯定製的比較:比較器compare()如何在下面實現的方法內部工作?

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); 

爲這是輸出:[信用卡式,禮金券,禮金券,tendercoupon,tendercoupon]。

我無法理解它是如何對內部方法進行排序的?

+0

很容易理解,如果你把調試點和檢查。 – rathna

回答

2

這個比較沒有多大意義。

  • 比較"tendercoupon"XX
  • 比較後總是會責令"tendercoupon"X"tendercoupon"總會訂購後X"tendercoupon"
  • 比較"paypal"X總會訂購X"paypal"
  • 比較X後到"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); 
    } 
} 
+0

我們的目標是最終有投標,而信用卡總是在開始。如果有貝寶而不是信用卡,請在頂部有貝寶。所以輸出應該總是像這樣[creditcard或paypal,giftcard,tendercoupon] – Abhilash28Abhi

+0

@ Abhilash28Abhi看我的編輯 – Alexander

+0

這將毫無疑問地工作。但我使用的代碼是我們應用程序中的現有代碼,我很好奇它是如何正確工作的。 – Abhilash28Abhi

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」w即使琴絃相同,也應該返回1。