2017-10-15 5 views
3

J'ai deux cartes de chaîne avec longue, je veux calculer le pourcentage en comparant une valeur de carte avec une autre valeur de carte.Calculer le pourcentage en comparant 2 cartes utilisant java 8 stream API?

Pour exemple:

Map<String, Long> map1 = new ConcurrentHashMap<String, Long>(); 
map1.put("test1", (long) 20); 
map1.put("test2", (long) 30); 
Map<String, Long> map2 = new ConcurrentHashMap<String, Long>(); 
map2.put("test1", (long) 120); 
map2.put("test2", (long) 120); 

Je veux calculer la moyenne de test1 et de la valeur de test2 en comparant la valeur map2 avec la valeur map1.

Résultat souhaité doit être

resultmap = [test1 : "16.66%", test2 : "25%"] 
+0

Pouvez-vous nous montrer comment vous calculez ces valeurs? Test1 = 20/120 = 0,1667? – markspace

+0

oui test1 = 20/120 * 100 = 16,67% test2 = 30/120 * 100 = 25% –

+0

Je ne sais pas à propos de "défectueux" mais j'ai du mal à penser comment faire cela avec les flux. Sur le plan procédural, ce n'est pas trop dur. – markspace

Répondre

5

Quelque chose comme ça

private static String asPercent(long l1, long l2) { 
    return String.format("%2.2f%%", ((float) l1/l2 * 100)); 
} 

et

final Map<String, String> percentMap = map1.entrySet().stream() 
     .collect(Collectors.toMap(Map.Entry::getKey, entry -> asPercent(entry.getValue(), map2.get(entry.getKey())))); 
System.out.println(percentMap); 

Cela suppose que pour chaque clé que vous avez dans map1 il y a une entrée dans map2. Mon code produit 16.67% et vous vouliez 16.66%; Si vous avez vraiment besoin d'une troncature au lieu d'un arrondi plus précis (mathématiquement), vous devrez probablement ajouter un certain code d'arrondi.