2017-10-06 5 views
3

J'essaye de trier une liste puis de grouper les éléments. Le problème est que lorsque je grouper les éléments, l'ordre de tri est en cours de lancer. Ci-dessous mon morceau de codeComment utiliser Grouper et trier ensemble dans JAVA 8

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

Voici comment ma sortie vient pour le code ci-dessus

{ 
    "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", 
     }, 
} 

Fondamentalement, mon exigence est de montrer premier type de chambre la moins chère. Donc la sortie devrait être groupée par première salle de roi d'abord car elle a la pièce la moins chère de 370 £.

SORTIE ATTENDUS ->

{ 
     "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", 
      } 

    } 

Pouvez-vous s'il vous plaît me suggérer une autre méthode ou ce qui est erroné avec la mise en œuvre ci-dessus, de nouvelles idées sont les bienvenues.

+0

https: // stackoverflow .com/a/28765069/2711488 – Holger

Répondre

2

Vous devez utiliser la fonction groupingBy étendue pour créer un TreeMap ou une autre NavigableMap:

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

Cela ne fonctionne pas. Le TreeMap attend un comparateur pour les clés, c'est-à-dire le résultat de 'getRoomInfoLabel()', pas les instances de 'DXARoom'. La seule solution est d'utiliser l'approche de tri de l'OP avant le regroupement et de faire le regroupement en 'LinkedHashMap'. – Holger

1

On dirait que vous cherchez ceci:

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

Cette solution a fonctionné pour moi

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

Fondamentalement d'abord,

  • Nous devons trier toute la liste
  • liste des groupes dans une nouvelle LinkedHashMap car elle préserve l'ordre d'insertion, qui est la clé

Merci @Holger