Klassen Berechnen mehrerer Map-Werte

PaulGustav

Mitglied
Hallo zusammen,

ich habe mal wieder eine Frage an euch und würde mich freuen, wieder eine kompakte Lösung zu erhalten.

Ich versuche derzeit Werte von immer wieder auftauchenden Schlüssel-IDs aufzurechnen. Dafür habe ich eine HashMap in der Form
Map <Long, KlasseX> map = new HashMap<>()
erstellt. Ich weiß, dass man mittels der neuen Java8-Methode map.computeIfPresent() den Wert eines Schlüssels berechnen kann und würde das gerne auch auf eine ganze Klasse und deren Werte übertragen. Die KlasseX, so wie ich sie habe, enthält ca 4 Integer- bzw Floar-Objekte , welche auch schon mittels Getter und Setter versehen sind.

Folgendes theoretisches Beispiel:
Schlüssel, (Eigenschaften)
1000000001, (10, 150.50, 600.00)
1000000002, (0, 100.00, 200.50)
1000000001, (20, 110.50, 730.00

ich möchte quasi, dass der Schlüssel 1000000001 die Werte (30, 261.00, 1300.00) erhält.

Ist mein Sachverhalt so mit der Funktion möglich oder gibt es da bereits bessere Methoden? Braucht ihr vllt ein Minimalbeispiel samt Klasse und Objekte?

Viele Grüße und vielen Dank,
Paul
 

Thallius

Top Contributor
Ich finde das benutzen einer Map hier nicht sehr sinnvoll. Damit schränkst du dich von Anfang an zu sehr ein.

Mach doch eine Klasse mit zwei Attributen. Einem Long für den Schlüssel und einer List (oder wenn es wirklich immer nur 4 sein sollen einem Array) für die Elemente.

Gruß

Claus
 

PaulGustav

Mitglied
Okay, den Gedanken hatte ich auch mal gefast, jedoch wieder verworfen. Für die Liste muss ja dann sicherlich eine Schleife geschrieben werden, die die Attribute des jeweligen Schlüssels aktualisiert.

Falls ich auf die Lösung gekommen bin, werde ich sie mal hier posten.

Ich danke dir.
 

PaulGustav

Mitglied
Muss dann für jeden Schlüssel eine eigene Liste her?

Ich überlege gerade wie die Liste auszusehen hat..? etwa so:
Java:
Inhalt des SourceFiles "appleFile.csv":
appleID, announcedAppels, announcedWeight,
1000000001, 10, 150.50
1000000002, 0, 100.00
1000000001, 20, 110.50

-----------------------------------------------

String appleID, announcedAppels, announcedWeight;
Long id;
int numberOfApples;
float weigth;

List<String[]> appleBoxes = new ArrayList<>;

//reading line of appleFile.csv...
String[] content = line.split(",");
appleID = content[0]);
announcedAppels = (content[1];
announcedWeight = (content[2];

for (int i=0; i < appleBoxes.size(); i++){
    if (appleBoxes.get(i).contains(String.valueOf(id)){
        numberOfApples += Int.parseInt(announcedAppels);
        weigth += float.ParseFloat(announcedWeight);
    }
    appleBoxes.set(i, Array.asList(appleID, announcedAppels, announcedWeight));
}
 

Thallius

Top Contributor
Warum in Gottes Namen benutzt du keine Klassen? Dafür sind die doch erfunden worden. Wer soll diesen Chaoscode denn später noch verstehen geschweige denn warten? Wie fragst du dann zum Beispiel die Anzahl Äpfel ab? Mit box[1]? Wer soll das kapieren?
 

PaulGustav

Mitglied
Ich habe schon eine Klasse verwendet. So ist das nicht. Da die ganzen Zusammenhänge meines Erachtens jedoch zu komplex wären, habe ich nur ein minimales Beispiel gebracht.

Hier nun nochmal folgendes Skript:
Java:
Inhalt des SourceFiles "appleFile.csv":
timestamp, appleID, announcedAppels, announcedWeight,
2015-01-01Z12:12:00T,1000000001, 10, 150.50
,1000000002, 0, 100.00
,1000000001, 20, 110.50
2015-01-02Z12:12:00T,1000000001, 15, 100.00
,1000000002, 10, 200.00
,1000000001, 25, 140.00

-----------------------------------------------

public class AppleBoxes{
   
    private static final int COLUMN_WEIGHT = 2;
    private static final int COLUMN_NUMBEROFAPPLES = 1;
   
    private Long id;
    private float weigth;
    private int numberOfApples;
   
    public AppleBoxes (Long id){
        this.id = id;
    }
   
    public void setDataLine(String[] content) {
        if (isNullOrBlank((content[COLUMN_WEIGHT])))
            weight += 0;
        else
            weigth += Float.parseFloat(content[COLUMN_WEIGHT]);
        if (isNullOrBlank(content[COLUMN_NUMBEROFAPPLES]))
            numberOfApples += 0;
        else
            numberOfApples += Float.parseFloat(content[COLUMN_NUMBEROFAPPLES]);
    }
   
    public float getWeight() {
        return weight;
    }

    public int getnumberOfApples() {
        return numberOfApples;
    }
   
}

public Class BoxRanking {
    public static void main(String[] args) throws Exception {
        AppleBoxes id = null;
        List<AppleBoxes> aggregatedAppleBoxes = new ArrayList<>;
        try {......
        //reading lines of appleFile.csv...
            while (line = br.readLine() != null){
                String[] content = line.split(",");
                if (StringUtils.isEmpty(content[COLUMN_TIMESTAMP]) == false){
                    AppleBoxes id = new AppleBoxes(content);
                    id.setDataLine(content);
                    aggregatedAppleBoxes.add(id)
                }
                else if (content[COLUMN_TIMESTAMP].isEmpty()){
                    id.setDataLine(content);
                    aggregatedAppleBoxes.add(id)
                }
       
       
            }
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
   
}

Es soll eine Liste / Map generiert werden, in der die Schlüssel nur einmal vorkommen und und die entsprechenden Werte (Gewicht, Anzahl) aggregiert werden. Die Sache mit dem Zeitstempel kommt dann aufgrund des Filterns noch hinzu, aber wenn ich die Aggregation auf die Schlüssel hinbekomme, wäre das schon sehr gut.

Es handelt sich nach wie vor nur um ein Beispiel.

Vielen Dank für eure Hilfe.
 

mrBrown

Super-Moderator
Mitarbeiter
Ich finde den Ansatz mit der Map prinzipiell sinnvoll.

Ich würd nur AppleBox anders aufbauen und immutable machen, dann könnte man das Recht leicht mit Map::merge machen
 

PaulGustav

Mitglied
Hallo mal wieder.

ich habe die Problematik nun gelöst und es hinbekommen über die Map-API Werte meiner Schlüsselobjekte zu berechnen. Es klappt wie folgt:
Nehmen wir noch einmal das Beispiel der AppleBox
Java:
Inhalt des SourceFiles "appleFile.csv":
timestamp, appleID, announcedAppels, announcedWeight,
2015-01-01Z12:12:00T,1000000001, 10, 150.50
,1000000002, 0, 100.00
,1000000001, 20, 110.50
2015-01-02Z12:12:00T,1000000001, 15, 100.00
,1000000002, 10, 200.00
,1000000001, 25, 140.00

-----------------------------------------------

public class AppleBoxes{
 
    private static final int COLUMN_WEIGHT = 3;
    private static final int COLUMN_NUMBEROFAPPLES = 2;
 
    private float weigth;
    private int numberOfApples;
 
    public AppleBoxes(String[] content) {
        if (isNullOrBlank((content[COLUMN_WEIGHT])))
            weight = 0;
        else
            weigth = Float.parseFloat(content[COLUMN_WEIGHT]);
        if (isNullOrBlank(content[COLUMN_NUMBEROFAPPLES]))
            numberOfApples = 0;
        else
            numberOfApples = Float.parseFloat(content[COLUMN_NUMBEROFAPPLES]);
    }
  
    public void updateAppleBoxes(String[] content) {
         if (isNullOrBlank((content[COLUMN_WEIGHT])))
            weight += 0;
        else
            weigth = Float.parseFloat(content[COLUMN_WEIGHT]);
        if (isNullOrBlank(content[COLUMN_NUMBEROFAPPLES]))
            numberOfApples += 0;
        else
            numberOfApples = Float.parseFloat(content[COLUMN_NUMBEROFAPPLES]);
    }
  
 
    public float getWeight() {
        return weight;
    }

    public int getnumberOfApples() {
        return numberOfApples;
    }
 
}

public Class BoxRanking {
  
    private static final int COLUMN_BOXID = 1;
  
    public static void main(String[] args) throws Exception {
        AppleBoxes id = null;
        Map<Long ,AppleBoxes> aggregatedAppleBoxes = new hashMap<>();
        // we need to assume, that the listOfBoxIDs is filled with all IDs
        List<Long> listOfBoxIDs = new List<>();
        try {......
        //reading lines of appleFile.csv...
            while (line = br.readLine() != null){
                String[] content = line.split(",");
                if (StringUtils.isEmpty(content[COLUMN_TIMESTAMP]) == false){
                    Long boxID = content[COLUMN_BOXID]);
listOfBoxIDs.add(boxID);
                    for (Long boxID : listOfBoxIDs){
                    AppleBoxes appleBoxes = aggregatedAppleBoxes.get(boxID);
                    if (appleBoxes == null){
                        appleBoxes = new AppleBoxes (content);
                        aggregatedAppleBoxes.add(boxID,appleBoxes)
                    }
                    else if (appleBoxes != null){
                        appleBoxes.updateAppleBoxes(content);
                        aggregatedAppleBoxes.add(boxID, appleBoxes);
                    }
                }
                else if (content[COLUMN_TIMESTAMP].isEmpty()){
                    id.setDataLine(content);
                    aggregatedAppleBoxes.add(id)
                }
            }
        }
        catch(IOException ex) {
            ex.printStackTrace();
        }
    }
 
}

Es genügt also innerhalb der Klasse Apples eine neue Methode zu schreiben und diese Daten wie im Code anzuwenden.

Ich danke euch trotzdem für die vielen Ratschläge.

Gruß Paul
 

mrBrown

Super-Moderator
Mitarbeiter
Ein paar Anmerkungen:

Java:
public AppleBoxes(String[] content) {
        if (isNullOrBlank((content[COLUMN_WEIGHT])))
            weight = 0;
        else
            weigth = Float.parseFloat(content[COLUMN_WEIGHT]);
        if (isNullOrBlank(content[COLUMN_NUMBEROFAPPLES]))
            numberOfApples = 0;
        else
            numberOfApples = Float.parseFloat(content[COLUMN_NUMBEROFAPPLES]);
    }
 
    public void updateAppleBoxes(String[] content) {
         if (isNullOrBlank((content[COLUMN_WEIGHT])))
            weight += 0;
        else
            weigth = Float.parseFloat(content[COLUMN_WEIGHT]);
        if (isNullOrBlank(content[COLUMN_NUMBEROFAPPLES]))
            numberOfApples += 0;
        else
            numberOfApples = Float.parseFloat(content[COLUMN_NUMBEROFAPPLES]);
    }

Das erstellen und das updaten sollte besser unabhängig von der Repräsentation in der Datei sein. Der Konstuktor kann einfach die beiden entsprechenden Werte bekommen, und update entweder die entsprechenden Werte, oder eine andere AppleBox (was ein besserer Name als AppleBoxes wäre, Klassennamen sollten im Singular gehalten werden).

Deine BoxRanking ist doch überhaupt nicht kompilierbar.
So Dinge wie:
Java:
Long boxID = content[COLUMN_BOXID]);
for (Long boxID : listOfBoxIDs){
sind auch totaler Unsinn, genauso wie der Inhalt der for-Schleife, hast du das mal getestet?
 

PaulGustav

Mitglied
Das erstellen und das updaten sollte besser unabhängig von der Repräsentation in der Datei sein. Der Konstuktor kann einfach die beiden entsprechenden Werte bekommen, und update entweder die entsprechenden Werte, oder eine andere AppleBox (was ein besserer Name als AppleBoxes wäre, Klassennamen sollten im Singular gehalten werden).

Was genau meinst du Repräsentation in der Datei. In meinem vorliegenden Fall habe ich eine separate Klasse, wo die Eigenschaften gespeichert werden und dort habe ich den Konstruktor und die Methode genauso angewandt.

Deine BoxRanking ist doch überhaupt nicht kompilierbar.
So Dinge wie:
Java:
Long boxID = content[COLUMN_BOXID]);
for (Long boxID : listOfBoxIDs){
sind auch totaler Unsinn, genauso wie der Inhalt der for-Schleife, hast du das mal getestet?

Ja es kann gut sein, dass der Code nicht einwandfrei kompilierbar ist. Tut mir Leid, dass ich mir da nicht mehr Mühe gegeben habe. Mein eigentlicher Code ist länger und enthält mitunter noch einige Methoden, die ich hier nicht alle erklären wollten. Zudem handelt es sich bei mir nicht um Apfelkisten.

Hier mal nur meine Schleifen zum Auslesen der Daten. Die läuft zumindest:
Java:
if (StringUtils.isEmpty(content[COLUMN_TIMESTAMP]) == false && line.contains(",") == true) {
                    List<Long> dsegColumnList = new ArrayList<>(100);
                    String dsegColumn = content[COLUMN_DSEGID];
                    getDsegs(dsegColumn, dsegColumnList);
                    for (Long segmentID : dsegColumnList){
                        DsegProperties dsegProperties = mapping.get(segmentID);
                        if (dsegProperties == null){
                        dsegProperties = new DsegProperties(content,mapProperties,segmentID);
                        mapping.put(segmentID, dsegProperties);
                        }
                        else if(dsegProperties != null){
                        dsegProperties.updateDsegID(content, mapProperties, segmentID);
                        mapping.put(segmentID, dsegProperties);
                        }
                        }
                    }
                   
                else if (...){...
                     }
 

mrBrown

Super-Moderator
Mitarbeiter
Was genau meinst du Repräsentation in der Datei. In meinem vorliegenden Fall habe ich eine separate Klasse, wo die Eigenschaften gespeichert werden und dort habe ich den Konstruktor und die Methode genauso angewandt.
AppleBoxes enthält die Daten und übernimmt das Umwandeln der Daten aus der Datei, das trennt man besser.

Hier mal nur meine Schleifen zum Auslesen der Daten. Die läuft zumindest:
Was soll denn dsegColumnList sein, Liste aller IDs?
Dann gibt dir mapping.get(segmentID); immer ein Objekt zurück und es greift immer der else-Fall. Das if kannst du dir im else-Fall übrigens sparen, da ist schon klar, das es ungleich null ist.
 

PaulGustav

Mitglied
ja in der dsegColumnList werden die IDs (aus der Spalte der gemeldeten IDs) gespeichert. Aber wenn die segmentID noch nicht mit Werten versehen ist, gibt mir Java doch zuerst null wieder.
 

mrBrown

Super-Moderator
Mitarbeiter
segmentID kann nur null sein, wenn du dsegColumnList explizit null hinzufügst. Wenn die Liste leer ist, wird die for-Schleife überhaupt nicht ausgeführt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
laxla123 Quersumme berechnen Java Basics - Anfänger-Themen 1
I For Schleife Summe berechnen Java Basics - Anfänger-Themen 13
S Vollmond berechnen und ausgeben Java Basics - Anfänger-Themen 12
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
A Berechnen Moor Nachbarschaft Java Basics - Anfänger-Themen 5
E Geburtstag im Schaltjahr berechnen Java Basics - Anfänger-Themen 24
Lion.King Schaltjahr berechnen Java Basics - Anfänger-Themen 31
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
I Zuschläge berechnen Java Basics - Anfänger-Themen 15
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
L Präfix berechnen Java Basics - Anfänger-Themen 33
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
I Potenz berechnen mit for-Schleife Java Basics - Anfänger-Themen 3
A Standardabweichung in Java berechnen Java Basics - Anfänger-Themen 10
H Gesamtabweichung mit Array berechnen Java Basics - Anfänger-Themen 2
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
V Rückgeld berechnen Java Basics - Anfänger-Themen 6
eleonori Durchschnitt aller Werte eines Baums berechnen Java Basics - Anfänger-Themen 5
Ianatrix Zahlen von a bis b berechnen Java Basics - Anfänger-Themen 7
L Max, min, Summe und Durchschnitt berechnen Java Basics - Anfänger-Themen 4
L Anhalteweg berechnen Java Basics - Anfänger-Themen 6
Aeon Erste Schritte Preise berechnen mit do-while Java Basics - Anfänger-Themen 9
M Quadratwurzel berechnen Java Basics - Anfänger-Themen 8
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Abschreibungsplan berechnen Java Basics - Anfänger-Themen 23
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
J Array Speicherplatz berechnen Java Basics - Anfänger-Themen 35
H Eingabedaten berechnen Java Basics - Anfänger-Themen 9
B Tranportkosten berechnen mit unterschiedlichen MwSt Java Basics - Anfänger-Themen 9
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
N Ein Datum berechnen Java Basics - Anfänger-Themen 3
T Sparplan berechnen Java Basics - Anfänger-Themen 4
F Abstand zum Durchschnitt von 5 Zahlen berechnen... Java Basics - Anfänger-Themen 16
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
P Mittelwert Arrayelemente berechnen Fehler Java Basics - Anfänger-Themen 5
CptK Best Practice Schussparabel berechnen Java Basics - Anfänger-Themen 3
T Modulo / Pow berechnen Java Basics - Anfänger-Themen 4
E Statistische Kennzahlen berechnen Java Basics - Anfänger-Themen 2
F Switch Case Modulo berechnen Java Basics - Anfänger-Themen 12
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
C Preis berechnen mit Java Java Basics - Anfänger-Themen 4
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
Dawinartor Erste Schritte Schaltjahr berechnen Java Basics - Anfänger-Themen 1
L Pi berechnen Java Basics - Anfänger-Themen 1
CptK Term (als String) berechnen und ausgeben Java Basics - Anfänger-Themen 10
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
J Variablen arithmetischen Mittelwert berechnen Java Basics - Anfänger-Themen 5
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
M Erste Schritte Mittelwert berechnen -> Methode in der Methode? Java Basics - Anfänger-Themen 14
S Compiler-Fehler Schaltjahr berechnen Java Basics - Anfänger-Themen 5
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
R Liga Berechnen Java Basics - Anfänger-Themen 1
R Fussballtabellen berechnen Java Basics - Anfänger-Themen 12
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
F ISBN Prüfziffer berechnen Java Basics - Anfänger-Themen 17
F Die Teilersumme einer Eingabe berechnen Java Basics - Anfänger-Themen 11
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
G Array Mittelwert berechnen, wie? Java Basics - Anfänger-Themen 8
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
N Mit LocalDate alter berechnen Java Basics - Anfänger-Themen 3
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
A Wochentag berechnen Java Basics - Anfänger-Themen 10
Ste3et_C0st Vectoren berechnen Java Basics - Anfänger-Themen 8
L Durchschnitt in der Schleife berechnen Java Basics - Anfänger-Themen 11
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
L Wochentag berechnen Java Basics - Anfänger-Themen 5
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
V Mittelwert berechnen Java Basics - Anfänger-Themen 31
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
P Quadrate berechnen Java Basics - Anfänger-Themen 3
S OOP Datumsunterschied in Tagen berechnen Java Basics - Anfänger-Themen 3
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3
B Schaltjahre berechnen! Java Basics - Anfänger-Themen 1
A werte in einem String berechnen Java Basics - Anfänger-Themen 3
F Checksummen aus int-Array berechnen Java Basics - Anfänger-Themen 3
F Toto-Tipp-Reihen berechnen Java Basics - Anfänger-Themen 1
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
R Quersumme berechnen - Methodenproblem Java Basics - Anfänger-Themen 1
S Button "Berechnen" geht nicht Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben