2017-10-06 144 views
3

我想一個列表排序,然後組的元素。問題是,當我對元素進行分組時,排序順序就是折騰。 下面是我的一段代碼如何使用分組和排序一起JAVA 8

listOfRooms.stream().sorted(Comparator.comparing(DXARoom::getStayAverageRate)) 
     .collect(Collectors.groupingBy(DXARoom::getRoomInfoLabel)); 

這是我的輸出是如何來對上述碼

{ 
    "Presidential suite": [ 
     { 
      "roomInfoLabel": "Presidential suite", 
      "stayAverageRate": "1696.0", 
     }, 
     { 
      "roomInfoLabel": "Presidential suite", 
      "stayAverageRate": "1729.0", 
     },  
    "Premier king room": [ 
     { 
      "roomInfoLabel": "Premier king room", 
      "stayAverageRate": "370.0", 
     }, 
     { 
      "roomInfoLabel": "Premier king room", 
      "stayAverageRate": "377.0", 
     }, 
} 

基本上,我的要求是首先顯示最便宜的房間類型。 因此,輸出應首先由總理國王室分組,因爲它具有最便宜的370英鎊的房間。

預期輸出 - >

{ 
     "Premier king room": [ 
      { 
       "roomInfoLabel": "Premier king room", 
       "stayAverageRate": "370.0", 
      }, 
      { 
       "roomInfoLabel": "Premier king room", 
       "stayAverageRate": "377.0", 
      }, 
      "Presidential suite": [ 
      { 
       "roomInfoLabel": "Presidential suite", 
       "stayAverageRate": "1696.0", 
      }, 
      { 
       "roomInfoLabel": "Presidential suite", 
       "stayAverageRate": "1729.0", 
      } 

    } 

能否請你建議我任何其他方法或什麼是錯與上面的實現,任何新的想法,歡迎。

+0

https://開頭計算器.com/a/28765069/2711488 – Holger

回答

2

您需要使用擴展groupingBy函數創建一個TreeMap或其他一些NavigableMap

listOfRooms.stream(). 
    .collect(Collectors.groupingBy(DXARoom::getRoomInfoLabel, 
      () -> new TreeMap(Comparator.comparing(DXARoom::getStayAverageRate)), 
      Collectors.toList())); 
+3

這不起作用。 'TreeMap'需要一個比較鍵,即getRoomInfoLabel()的結果,而不是'DXARoom'實例。唯一的解決方案是在分組之前使用OP的排序方法,並將其分組到「LinkedHashMap」中。 – Holger

1

好像你正在尋找這樣的:

Collectors.groupingBy(
     DXARoom::getRoomInfoLabel, 
     LinkedHashMap::new, 
     Collectors.toList()); 
2

該解決方案爲我

 .sorted(Comparator.comparing(DXARoom::getStayAverageRate)) 
     .collect(Collectors.groupingBy(DXARoom::getRateInfoLabel, LinkedHashMap::new, Collectors.toList())); 

基本上第一,

  • 我們需要梳理整個列表中一個新的LinkedHashMap
  • 組列表,因爲它保留了插入順序,這是關鍵

感謝@Holger