2017-10-12 57 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中的所有鍵和值,按鍵排序? – broxhouse

0

有沒有這種可能性,因爲你是根據東西分揀只有你自己知道。

我的意思是,你首先由Key1比較,然後Key2等按鍵不是在地圖編號,在這裏Key1並不意味着first key,但some key that you want compared first。沒有辦法告訴java,這種行爲太具體了。

你可以想出一些通用的解決方案(比如更多按鍵的地圖,所以你不必像這樣列出),但是你不能避免這個實現的主要問題。