2017-10-06 140 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