J'ai une liste liée comme ci-dessous. J'ai besoin de la sortie en tant que Treemap comme indiqué ci-dessous - à condition que les conditions ci-dessous soient remplies, P> month.entrySet().forEach(monthYear -> {
String[] splitMonthYear = monthYear.getKey().split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
String fullMonth = splitMonthYear[0];
String fullYear = splitMonthYear[1];
if (fullMonth.equalsIgnoreCase("jan")) {
output.put(String.valueOf(Integer.parseInt(fullYear) - 1), monthYear);
} else {
output.put(fullYear, monthYear);
}
});
3 Réponses :
Vous pouvez utiliser à l'aide de C'est le résultat (semble que votre résultat attendu est mal pour les données que vous avez postées) p> collectors.groupingby code> pour regrouper les éléments de flux par une touche. La clé est déterminée par la méthode
getyeartogroupunder code> dont la logique est identique à celle que la vôtre (Remarque: la regex peut être simplifiée).
Collectors.summingint code> comme un collecteur en aval , nous résumons les valeurs de toutes les entrées de carte qui sont mappées sur la même clé em>. p>
Selon cette logique:
month.forEach((key,val) -> { String year = ""; if(key.substring(0,3).equalsIgnoreCase("jan")){ year = Integer.toString(Integer.parseInt(key.substring(3)) -1); }else{ year = key.substring(3); } if(output.containsKey(year)){ output.put(year,output.get(year) + val); }else{ output.put(year,val); } });
une solution simple à l'aide de pour code> boucle.
TreeMap<Integer, Integer> output = new TreeMap<>();
for(String key : month.keySet()){
String mon = key.substring(0,3);
int val = Integer.parseInt(key.substring(3));
if(mon.equals("Jan")){
output.put(val-1, output.getOrDefault(val-1, 0)+month.get(key));
}else{
output.put(val, output.getOrDefault(val, 0)+month.get(key));
}
}