Summieren wenn

Diskutiere Summieren wenn im Allgemeine Java-Themen Bereich.
P

Pietro

Ich habe eine Liste 1. S
spalte Datum und uhrzeit 2. Spalte Anzahl
Nun möchte ich, eine stündliche Summe der Anzahl haben .
Dafür müssten die Zeilen bei der Spalte mit Anzahl solange addiert werden bis es das Datum und die Uhrzeit erreicht hat die ca. Ne Stunde ist

Wie kann ich da vorgehen?

Mir array und if abfrage ?
 
mihe7

mihe7

Hier mal ein wenig Code. Für Dich relevant ist in erster Linie die Methode summiere(). Die ließe sich mit Streams und Lambdas wesentlich kürzer schreiben, aber ich denke, Du solltest erstmal damit zurecht kommen ;)

Java:
import java.time.*;
import static java.time.temporal.ChronoUnit.HOURS;
import java.util.*;

public class Test {
    static class Eintrag {
        final LocalDateTime zeit;
        final int anzahl;
        
        public Eintrag(LocalDateTime zeit, int anzahl) {
            this.zeit = zeit;
            this.anzahl = anzahl;
        }            
        
        @Override
        public String toString() {
            return "[" + zeit.toString() + "/" + anzahl + "]";
        }
    }
    
    public static void main(String[] args) {
        List<Eintrag> eintraege = createDummies();
        Map<LocalDateTime, Integer> summen = summiere(eintraege);
        System.out.println("Eintraege: " + eintraege);
        System.out.println("Summen: " + summen);
        
    }
    
    private static Map<LocalDateTime, Integer> summiere(
            List<Eintrag> eintraege) {
        Map<LocalDateTime, Integer> summen = new HashMap<>();
        
        for (Eintrag e : eintraege) {
            LocalDateTime hour = e.zeit.truncatedTo(HOURS);
            if (!summen.containsKey(hour)) {
                summen.put(hour, 0);
            }
            summen.put(hour, summen.get(hour) + e.anzahl);
        }
        
        return summen;
    }
    
    private static List<Eintrag> createDummies() {
        Random rand = new Random(1L);
        LocalDateTime start = LocalDateTime.parse("2019-04-18T22:00");
        
        List<Eintrag> eintraege = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            LocalDateTime cur = start.plusMinutes(rand.nextInt(400));
            eintraege.add(new Eintrag(cur, rand.nextInt(20)+1));
        }
        
        return eintraege;
    }
}
 
mihe7

mihe7

Vielen Dank :) was sind streqms und lambdas ? Ich bin Anfänger...
S. Antwort von @M.L. ; konkret würde das z. B. so aussehen:
Java:
    private static Map<LocalDateTime, Integer> summiere(
            List<Eintrag> eintraege) {
        return eintraege.stream()
            .collect(groupingBy(e -> e.zeit.truncatedTo(HOURS),
                                summingInt(e -> e.anzahl)));
    }
 
Thema: 

Summieren wenn

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben