2017-03-06 11 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

この比較はあまり意味がありません。 Xから"tendercoupon"を比較

  • は常に"tendercoupon"を注文します"tendercoupon"からXを比較X
  • は常にXXから"paypal"を比較
  • "tendercoupon"後を注文します後、常に 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

最終的にクレジットカードは常に最初に、テンポクーポンを最終的に持たせることです。クレジットカードの代わりにpaypalがある場合は、最上部にpaypalがあります。だから出力は常にこのようになるはずです[クレジットカードまたはペイパル、ギフトカード、テンダークーポン] – 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; 
      } 
     } 
    }; 

あなたのバージョンでは、「テンダークーポン」と「テンダークーポン」を比較しているためです。w ouldは文字列が等しい場合でも1を返します。

関連する問題