2016-10-28 3 views
-1

Collections.sort()メソッドで呼び出されるカスタムコンパレータを使用して、StringのArrayListをソートしようとしています。 コードは、コンパレータは適切な値を返すコンパレータ<String>は適切な値を返しますが、ArrayListはソートされません。

public static String largestNumber(final List<Integer> a) { 
    ArrayList<String> list = new ArrayList<String>(); 
    for(int i=0; i<a.size(); i++) { 
     list.add(String.valueOf(a.get(i))); 
    } 

    Comparator<String> c = new Comparator<String>() { 
     public int compare(String s1, String s2) { 
      System.out.println("comparing: "+(s1+s2)+ 
      " and "+(s2+s1)); 
      System.out.println((s1+s2).compareTo(s2+s1)); 
      return (s1+s2).compareTo(s2+s1); 
     } 
    }; 

    for(int i=0; i<a.size(); i++) { 
     Collections.sort(list, c); 
     System.out.println("sorted:"); 
     for(int j=0; j<a.size(); j++) { 
      System.out.print(list.get(j)); 
     } 
     System.out.println(); 
    } 

    StringBuffer sb = new StringBuffer(); 
    for(int i=0; i<list.size(); i++) { 
     sb.append(list.get(i)); 
    } 
    return sb.toString(); 
} 

あります。たとえば、文字列 "303"と "330"を比較する場合は、負の値を返します。ただし、ArrayListは変更されません。どうしたの?

+1

あなたのニーズにあまりにも多くのループがあります。あなたのコードを実行すると、リストがソートされます。また、なぜ "(s1 + s2).compareTo(s2 + s1)" VS => s1.compareTo(s2)を実行するのですか? – alexbt

答えて

-1

問題の原因を突き止めました。私は返す必要があった(s2 + s1).compareTo(s1 + s2);

0

数値を比較する場合は、数値をIntegerに解析してから差し引くだけです。 Collectionは残りを処理します。

Comparator Interfaceは、Aの値がB(AB)の値よりも小さい場合は、Aが最初に来る場合、2つの要素が比較されていることを示すコントラクトです。 Aの値がBの値(A == B)と等しい場合、Collection実装はそれらを任意にまとめて配置する可能性があります。

あなただけの、次の操作を行う必要があります

Comparator<String> c = new Comparator<String>() { 
    public int compare(String s1, String s2) { 
     System.out.println("comparing: "+ s1 + 
     " and " +s2); 

     //Avoid the below check, it creates an infinite recursion. 
     //System.out.println(s1.compareTo(s2)); 

     //Since you Strings are number, it's ok to do this. 
     int a = Integer.parseInt(s1); //Auto-unboxing; 
     int b = Integer.parseInt(s2); //Auto-unboxing; 


     return a-b; 
    } 
}; 

また、comparationsの再帰を避けるため、それがStackOverFlowException例外につながるで無限再帰を作成します。

私は助けてくれることを願っています。

よろしくお願いいたします。 :)

関連する問題