0
votes

somme des valeurs de la liste liée basée sur le regroupement par année spécifique en clé utilisant Java

J'ai une liste liée comme ci-dessous. XXX PRE>

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


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser collectors.groupingby pour regrouper les éléments de flux par une touche. La clé est déterminée par la méthode getyeartogroupunder dont la logique est identique à celle que la vôtre (Remarque: la regex peut être simplifiée).

à l'aide de Collectors.summingint 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é . xxx

C'est le résultat (semble que votre résultat attendu est mal pour les données que vous avez postées) xxx


0 commentaires

1
votes

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


0 commentaires

1
votes

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


0 commentaires