2017-10-12 3 views
0

私はマップのリストを持っており、キーを使ってリスト内のマップをソートしたいと思います。今のところ、私は..以下Collections.sort方法を使用してこれを達成しています Java8の複数のキーを使用したマップのリストの並べ替え

Collections.sort(listOfMaps, new Comparator<Map<String, String>>() { 
     @Override 
     public int compare(Map<String, String> o1, Map<String, String> o2) { 
      //return o1.get("cm_order_x").compareTo(o2.get("cm_order_x")); 
      String x1 = o1.get(Key1); 
      String x2 = o2.get(Key1); 
      String x3 = o1.get(Key2); 
      String x4 = o2.get(Key2); 
      int sComp = x1.compareTo(x2); 
      int sComp1 = x3.compareTo(x4); 
      if (sComp != 0) { 
       return sComp; 
      } 
      else if(sComp1 != 0) { 

       //return x3.compareTo(x4); 
       return sComp1; 
      } 


       else 
       { 
        String x5 = o1.get(Key3); 
        String x6 = o2.get(Key3); 
        return x5.compareTo(x6); 
       } 
      } 

    }); 

は、Java 8で mapslistをソートする他のより良い方法はありますか?

+2

を、これらの変数は、本当に素晴らしい名前ではありません。 'x1'と' x2'は関連していると示唆するものは何もないが、 'x2'と' x3'は関連していない。私はあなたが "長い"名前を恐れないように勧めます: 'String key1FromO1 = o1.get(Key1)'、例えば。 – yshavit

+0

提案のおかげで@yshavit。私はこれを念頭に置いておきます。 –

答えて

3

Java8以来、Comparatorインタフェースは、ファクトリメソッドを提供していますし、メソッドの連鎖:風のものとして

Comparator<Map<String, String>> c 
    = Comparator.comparing((Map<String, String> m) -> m.get(Key1)) 
       .thenComparing(m -> m.get(Key2)) 
       .thenComparing(m -> m.get(Key3)) 
       .thenComparing(m -> m.get(Key4)); 

listOfMaps.sort(c); 
0

私はあなたがこのようなコードを使用してこのタスクを達成できると信じて:

listOfMaps.sort(Comparator.comparing(
       m -> m.get("yourKey"), 
       Comparator.nullsLast(Comparator.naturalOrder())) 
      ) 

を参照してください:あなただけが知っている何かに依存し、ソートされているのでHow can I sort a list of maps using Java 8?

+0

このスレッドを見ましたが、それは単一のキー用です。ソートするキーが複数ある場合はどうなりますか? –

+0

私はあなたの質問を理解することを確認しましょう。あなたはArrayListを反復処理し、それぞれの個々のHashMapをキーでソートしますか?または、各HashMapのすべてのキーと値をキーでソートしたHashMapを1つ作成しますか? – broxhouse

0

このの可能性は、ありません。私はあなたが最初に、Key1によってKey2などのキーがマップに番号付けされていません比較しているという意味では何

、ここKey1first keyが、some key that you want compared firstを意味するものではありません。これをJavaに伝える方法はありませんが、この動作はあまりにも具体的です。

一般的な解決策(キーが多いマップなど)を考え出すことができますが、そのようなものはすべてリストする必要はありませんが、この実装の主な問題を避けることはできません。

関連する問題