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));
}
}