2017-09-26 10 views
0

J'ai un List<Map<String, String>>. Une valeur particulière de la carte est une entrée numérique avec des décimales. Je souhaite trier la liste par ordre décroissant en fonction de cette valeur particulière de la carte.Tri d'une liste de Map <String, String> basée sur une valeur numérique particulière

par exemple:

List<Map<String, String>> foo= new ArrayList<Map<String, String>>(); 
Map<String, String> bar1 = new HashMap<>(); 
Map<String, String> bar2 = new HashMap<>(); 
Map<String, String> bar3 = new HashMap<>(); 

bar1.put("name", "abc"); 
bar1.put("score", "72.5"); 
bar1.put("sex", "male"); 
foo.add(bar1); 

bar2.put("name", "pqr"); 
bar2.put("score", "98.7"); 
bar2.put("sex", "female"); 
foo.add(bar2); 

bar3.put("name", "xyz"); 
bar3.put("score", "100.0"); 
bar3.put("sex", "male"); 
foo.add(bar3); 
. 
. 
. 
. 

et ainsi de suite

Je veux trier les List<Map<String, String>> par ordre décroissant de telle sorte que la carte contenant le score de 100,0 est sur le dessus.

J'ai essayé

Collections.sort(list, new Comparator<Map.Entry<K, V>>() { 
    @Override 
    public int compare(Map.Entry<K, V> o1, Map.Entry<K, V> o2) { 
     return (o1.getValue()).compareTo(o2.getValue()); 
    } 
}); 

mais le « V » est une chaîne ici, alors que j'ai besoin d'être trié comme un flotteur. Toute aide serait appréciée.

+0

double possible de [trier une carte par des valeurs (Java)] (https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java) – Flown

+0

Comment est- ceci supposé fonctionner si la valeur n'a pas pu être analysée à un flotteur? –

+0

@Flown Je peux me tromper, mais j'ai déjà essayé cette solution. Mon problème est avec le typage de la chaîne pour flotter ou pour être clair, en triant une carte avec une valeur flottante spécifique basée sur la valeur float. – cppnoob

Répondre

2

Si est impossible de créer une classe à partir de cette carte, vous pouvez faire quelque chose comme:

Collections.sort(foo, (o1, o2) -> { 
     return new BigDecimal(o2.get("score")).compareTo(new BigDecimal(o1.get("score"))); 
    }); 

ou si vous n'utilisez pas java 8:

Collections.sort(foo, new Comparator<Map<String, String>>() { 
      @Override 
      public int compare(Map<String, String> o1, Map<String, String> o2) { 
       return new BigDecimal(o2.get("score")).compareTo(new BigDecimal(o1.get("score"))); 
      } 
     }); 
+0

Il ne peut pas utiliser JAVA8 –

+0

Je ne peux pas créer une classe séparée car j'utilise un fichier YAML pour rendre les touches dynamiques. Mais sinon, votre solution a fonctionné. Merci – cppnoob

0

Pourquoi vous avez besoin List Of map, vous pouvez aller avec List<SomeClass> et trier comme vous le souhaitez, où une classe vous tiendra la valeur pour name sex score.

Edit: Vous pouvez utiliser convertir votre chaîne en float ou peut prendre flotteur En tant que type de données Someclass, il rend votre code très facile.

+0

J'ai posté une version très simplifiée d'un code existant. J'utilise yml pour rendre les touches dynamiques. Rassurez-vous, j'ai envisagé de créer une classe séparée, mais pour moi, ce n'est pas possible actuellement. – cppnoob

0

Cela pourrait être un autre solution simple.

Utilisez Float pour analyser la chaîne et utiliser existant comparer méthode de flotteur.

Collections.sort(foo, new Comparator<Map<String, String>>() { 
      @Override 
      public int compare(Map<String, String> o1, Map<String, String> o2) { 
       return Float.compare(Float.parseFloat(o2.get("score")), Float.parseFloat(o1.get("score"))); 
      } 
     });