如何在 JAVA 8 中一起使用分组和排序

Abh*_*oda 4 java java-8 java-stream

我正在尝试对列表进行排序,然后对元素进行分组。问题是,当我对元素进行分组时,排序顺序会被折腾。下面是我的一段代码

listOfRooms.stream().sorted(Comparator.comparing(DXARoom::getStayAverageRate))
        .collect(Collectors.groupingBy(DXARoom::getRoomInfoLabel));
Run Code Online (Sandbox Code Playgroud)

这就是我上面代码的输出方式

{
    "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",
        },
}
Run Code Online (Sandbox Code Playgroud)

基本上,我的要求是先显示最便宜的房型。因此,输出应首先按 Premier 大床房分组,因为它有 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",
            }  

    }
Run Code Online (Sandbox Code Playgroud)

您能否建议我任何替代方法或上述实现有什么问题,欢迎任何新想法。

Abh*_*oda 7

这个解决方案对我有用

        .sorted(Comparator.comparing(DXARoom::getStayAverageRate))
        .collect(Collectors.groupingBy(DXARoom::getRateInfoLabel, LinkedHashMap::new, Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

基本上首先,

  • 我们需要对整个列表进行排序
  • 在新的 LinkedHashMap 中分组列表,因为它保留了插入顺序,这是关键

谢谢@霍尔格


Eug*_*ene 2

看来您正在寻找这个:

Collectors.groupingBy(
        DXARoom::getRoomInfoLabel,
        LinkedHashMap::new,
        Collectors.toList());
Run Code Online (Sandbox Code Playgroud)