2017-08-05 17 views
-2

Treemapのコンパレータを正しく実装するにはどうしたらいいですか? 次のようにします。 1.行の長さで単語を降順で並べ替えます。 2.同じ長さの単語はアルファベット順に並べ替えられます。Treemapのコンパレータ

class Test implements Comparator<String> { 

    public static SortedMap<String, String> doSort(String str) { 
     Comparator<String> comparator = new Test(); 
     SortedMap<String, String> map = new TreeMap<>(comparator); 

     //do something to input String 

     return map; 
    } 


    @Override 
    public int compare(String o1, String o2) 
    { 
     return o2.length() - o1.length(); 
    } 
} 

で十分ですか? 2ターン目にアルファベットソートを追加するには?

+1

可能な複製を行う可能性がありますと仮定すると、[比較する方法複数のフィールドによるオブジェクト](https://stackoverflow.com/questions/369512/how-to-compare-objects-by-multiple-fields) –

+0

私はいくつかのフィールドは必要ありません。私はソートの2つの方法が必要です:1.Length。 2.アルファベット。 – naut92

答えて

0

は、Java 8+を使用している、あなたは、このようなJavaの7では

Comparator<String> comparator = (a,b) -> { 
    int r = Integer.compare(a.length(), b.length()); 
    if (r != 0) { 
     return r; 
    } 
    return a.compareTo(b); 
}; 

としてラムダでこれを書くことができるし、それ以前の、それはの

Comparator<String> comparator = new Comparator<String>() { 
    public int compare(String a, String b) { 
     int r = Integer.compare(a.length(), b.length()); 
     if (r != 0) { 
      return r; 
     } 
     return a.compareTo(b); 
    } 
}; 
+0

申し訳ありませんが、私は2つの並べ替え、1つだけの単語の長さが表示されません。私は2つが必要です:1.単語の長さ。 2.アルファベット。 それは、Treemap自体が比較文字列の長さをソートすることを意味しますか?残念ながら、私の場合は動作しません。 – naut92

+0

'r == 0 'をアルファベット順に比較したときに' a.compareTo(b);を返します。これはまさにあなたが求めていたものです。 –