Home > front end >  sum of duplicates data list on java
sum of duplicates data list on java

Time:02-08

I have this code

    ... some code here

    while (iterator.hasNext()) {
      Document next = iterator.next();

      projectNumber = new NpoProjectNumberVM();
      localDate = new java.sql.Date(((Date) next.get("_id")).getTime()).toLocalDate();
      projectNumber.setDay(localDate);
      projectNumber.setNumber(((Long) next.get("number")).intValue());
      projectNumberList.add(projectNumber);
    }

    return projectNumberList;

which displays this result

 "projectNumber": [
        {
            "day": "2022-02-07",
            "number": 2
        },
        {
            "day": "2022-02-07",
            "number": 1
        },
        {
            "day": "2022-02-07",
            "number": 4
        },
    ]

My request is: I want to have the sum of the numbers for the same date like this

 "projectNumber": [
        {
            "day": "2022-02-07",
            "number": 7
        },
    ]

CodePudding user response:

You may use a Map where the key is the date, so you can verify if it exists or not then do the good logic

static List<Document> method() {
    Map<LocalDate, Document> projects = new HashMap<>();

    while (iterator.hasNext()) {
        Document next = iterator.next();

        localDate = new java.sql.Date(((Date) next.get("_id")).getTime()).toLocalDate();
        int nb = ((Long) next.get("number")).intValue();

        if (projects.containsKey(localDate)) {
            projects.get(projectNumber).setNumber(nb   projects.get(projectNumber).getNumber());
        } else {
            projectNumber = new NpoProjectNumberVM();
            projectNumber.setDay(localDate);
            projectNumber.setNumber();
            projects.put(localDate, projectNumber);
        }
    }

    return new ArrayList<>(projects.values());
}

CodePudding user response:

Java 8 streams: GroupingBy

Use Java 8 streaming with some of the Collectors like groupingBy for the key and summingLong for the aggregate-function to return a Map<?, Long> (where ? stands for the key, here LocalDate):

Map<LocalDate, Long> sumByDay = projectNumberList.stream().collect(
    groupingBy(
        ProjectNumber::getDay,
        summingLong(ProjectNumber::getNumber)
    )
);

See also:

JSON output

To produce some JSON output like

"projectNumber": [
        {
            "day": "2022-02-07",
            "number": 7
        },
        {
            "day": "2022-02-01",
            "number": 1
        }
]

you could use Jackson with a custom Map-serializer.

  •  Tags:  
  • Related