Erste Schritte Einträge aus verschachtelter Map chronoligisch ausgeben

PaulGustav

Mitglied
Hallo zusammen,

ich stehe da vor einem kleinen Problem, was der ein oder andere vllt schon einmal gelöst hat. Undzwar besitze ich Datensätze mit Zeitangaben. Zu jeder Zeitangabe / jedem Timestamp werden neue Attribute angegeben. Für die Auswertung dieser Daten ist es mir wichtig, dass ich die Attribute, mit denen die Timestamps nach und nach belegt wurden, gespeichert bzw auch in einer csv festgehalten werden. Ich habe meine Angelegenheit mal auf das folgende Minimalbespiel übertragen:

Java:
package Implements;

import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class CumulatedList {
   
   public static void main(String[] args) {
       Map<String,Integer> counter = new HashMap<>();
        TreeMap<Instant, Map<String,Integer>> tm = new TreeMap<Instant, Map<String,Integer>>();
        String s;;
        Instant year1 = Instant.parse("2015-01-01T20:00:00Z");
        Instant year2 = Instant.parse("2016-01-01T20:00:00Z");
        Instant year3 = Instant.parse("2017-01-01T20:00:00Z");
       
        //input i=0
        counter.put("Hunde", 1);
        counter.put("Katzen", 2);
        counter.put("Mäuse", 0);
        tm.put(year1, counter);
        System.out.println("Jahr 2015:");
        System.out.println("Hunde: " + counter.get("Hunde"));
        System.out.println("Katzen: " + counter.get("Katzen"));
        System.out.println("Mäuse: " + counter.get("Mäuse"));
        System.out.println("\n");
       
        //input i=1
        counter.put("Katzen", 3);
        tm.put(year2, counter);
        System.out.println("Jahr 2016:");
        System.out.println("Hunde: " + counter.get("Hunde"));
        System.out.println("Katzen: " + counter.get("Katzen"));
        System.out.println("Mäuse: " + counter.get("Mäuse"));
        System.out.println("\n");
       
        //input i=2
        counter.put("Kühe", 10);
        tm.put(year3, counter);
        System.out.println("Jahr 2017:");
        System.out.println("Hunde: " + counter.get("Hunde"));
        System.out.println("Katzen: " + counter.get("Katzen"));
        System.out.println("Mäuse: " + counter.get("Mäuse"));
        System.out.println("Kühe: " + counter.get("Kühe"));
        System.out.println("\n");
       
        writeList(tm,counter);       
    }

   private static void writeList(TreeMap<Instant, Map<String, Integer>> tm, Map<String,Integer> counter) {
       ArrayList<List<String>> list = new ArrayList<>();
       for(Map.Entry<Instant, Map<String,Integer>> outerMap : tm.entrySet()){
           for(Map.Entry<String, Integer> innerMap : outerMap.getValue().entrySet()){
               
           Instant timestamp = outerMap.getKey();
           String animal = innerMap.getKey();
           int value = innerMap.getValue();
           list.add(Arrays.asList(timestamp.toString(),animal, String.valueOf(value)));
           }
       }
       System.out.println("Chronik: " + "\n" + list);
   }

}

Als Ergbnis erhalte ich
Chronik:
[[2015-01-01T20:00:00Z, Mäuse, 0],
[2015-01-01T20:00:00Z, Kühe, 10],
[2015-01-01T20:00:00Z, Katzen, 3],
[2015-01-01T20:00:00Z, Hunde, 1],
[2016-01-01T20:00:00Z, Mäuse, 0],
[2016-01-01T20:00:00Z, Kühe, 10],
[2016-01-01T20:00:00Z, Katzen, 3],
[2016-01-01T20:00:00Z, Hunde, 1],
[2017-01-01T20:00:00Z, Mäuse, 0],
[2017-01-01T20:00:00Z, Kühe, 10],
[2017-01-01T20:00:00Z, Katzen, 3],
[2017-01-01T20:00:00Z, Hunde, 1]]

Gern würde ich erreichen, dass die Kühe im Jahr 2015 noch nicht erwähnt werden und das das Attribut für "Katzen" noch nicht zusammengerechnet wird.

Worin liegt mein Fehler?
 

Harry Kane

Top Contributor
Du brauchst für jedes Jahr einen neuen "counter". Aktuell fügst du dem tm dieselbe Instanz mehrfach hinzu. In der writeList-methode siehst du dann für the one and only tm Instanz nur den letzten Stand.
 

PaulGustav

Mitglied
Ich habe leider einen Datensatz mit über 50k verschiedenen Timestamps. Und das wäre nur für ein Jahr.

Aber ja, dass nur die letzte Instanz gespeichert wird, habe ich schon irgendwie versucht zu umgehen. Am Besten wäre es doch sicherlich, wenn man seine Output-Datei, in diesem Fall die csv, immer wieder öffnen und eine neue Zeile hinzuschreiben würde. Meinst du das wäre okay. Ich gebe auch gerne ein Beispiel meiner Rohdaten.
 

Joose

Top Contributor
Wie Harry Kane schon gesagt hat musst du für jedes Jahr eine neue Hashmap erzeugen!
Was du bis jetzt machst ist eine einzige HashMap verwenden, diese ständig zu erweitern und 3x zu deiner TreeMap hinzuzufügen (jeweils mit einem anderen Datum). Daher sind dann "plötzlich" auch 2015 schon Kühe da.

Du musst für jedes Jahr eine neue HashMap Instanz erzeugen:
Java:
.....
   public static void main(String[] args) {
       Map<String,Integer> counter;
....
        counter = new HashMap<>();
        //input i=0
        counter.put("Hunde", 1);
        counter.put("Katzen", 2);
        counter.put("Mäuse", 0);
        tm.put(year1, counter);
....
        counter = new HashMap<>();
        //input i=1
        counter.put("Katzen", 3);
        tm.put(year2, counter);
....
        counter = new HashMap<>();      
        //input i=2
        counter.put("Kühe", 10);
        tm.put(year3, counter);
....
 

Harry Kane

Top Contributor
Was der beste Weg ist, hängt davon ab, was du genau machen möchtest.
Zeige mal einen Ausschnitt aus deinen Rohdaten, und wohin du sie transformieren möchtest.
 

PaulGustav

Mitglied
Vielen Dank für die Unterstützung. Leider habe ich erst jetzt gesehen, dass Harry Kane nochmal etwas gepostet hatte.
Ich habe mir die Arbeit nun ein wenig "erleichtert". Ich speichere nun die Attribute nicht mehr zu jedem einzelnem Zeitstempel, sondern habe mir eine Enum-Klasse gebaut, welche die die Datensätze entsprechend nach ihrem Zeitraum einordnet. Für meine Art von Analyse, brauche ich (vorerst) nur die Zeitscheiben Vormittags und Abends.
Die Lösung, die ich dafür gebaut habe, bedarf jedoch leider viel Rechenzeit. Ich werde dazu mal noch einen neuen Thread aufmachen.

Vielen Dank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N ResultSet auf Einträge überprüfen Java Basics - Anfänger-Themen 5
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
S CSV auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 8
K Datentypen Einträge zweier Matrizen vergleichen Java Basics - Anfänger-Themen 4
I Einträge in den Konstruktor Java Basics - Anfänger-Themen 3
S Problem: Array alle Einträge gleich Java Basics - Anfänger-Themen 10
M Erste Schritte JList einträge Java Basics - Anfänger-Themen 1
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
T Einträge in jComboBox aus Liste übernehmen Java Basics - Anfänger-Themen 1
S Wie bestehende Excel-Einträge mit neuen Vergleichen (mit Apache POI)? Java Basics - Anfänger-Themen 0
E Array doppelte Einträge Java Basics - Anfänger-Themen 2
S Variablen Array in ArrayList auf doppelte Einträge überprüfen Java Basics - Anfänger-Themen 4
T Alte Einträge im Array werden von neuen überschrieben Java Basics - Anfänger-Themen 5
P Doppelte Einträge in eine List Java Basics - Anfänger-Themen 5
D Javaliste auf gleiche Einträge überprüfen Java Basics - Anfänger-Themen 2
C Doppelte Einträge aus String [] Array entfernen. Java Basics - Anfänger-Themen 5
C Datentypen Array-Einträge überhalb der Array-Länge - welcher Wert? Java Basics - Anfänger-Themen 5
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
M Ziffer einträge vergrößern Java Basics - Anfänger-Themen 16
H Einträge aus Array löschen Java Basics - Anfänger-Themen 8
J Markierte Einträge (Dateien) in JList sollen in einen anderen Ordner verschoben werden. Java Basics - Anfänger-Themen 12
K ArrayList.add() überschreibt vorhandene Einträge. Java Basics - Anfänger-Themen 12
M Gewisse Einträge aus einer ArrayList löschen Java Basics - Anfänger-Themen 3
M doppelte Einträge Emailempfänger... Java Basics - Anfänger-Themen 35
K ArrayList Zugreifen auf Einträge Java Basics - Anfänger-Themen 8
G txt-File als DB>doppelte Einträge verhindern/Suche/... Java Basics - Anfänger-Themen 10
B 2D-Array, gleiche Einträge prüfen Java Basics - Anfänger-Themen 5
F Hiberate-Log-Einträge Java Basics - Anfänger-Themen 2
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
Beckenbauer OOP Durch Komma getrennte Einträge in einem String in ein Array oder eine Tabelle schreiben Java Basics - Anfänger-Themen 4
kitz Mehrere Einträge auswerfen? Java Basics - Anfänger-Themen 20
P Doppelte Einträge in mehreren Textfiles finden und ausgeben Java Basics - Anfänger-Themen 8
E Darstellung der Choice Einträge Java Basics - Anfänger-Themen 4
K Datentypen Liste: Einzelne Einträge ändern Java Basics - Anfänger-Themen 2
L Tray-Einträge und dazu passende ActionListener dynamisch erzeugen? Java Basics - Anfänger-Themen 2
J doppelte Einträge in einem Array Java Basics - Anfänger-Themen 7
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
M Einträge in JComboBox farblich hinterlegen? Java Basics - Anfänger-Themen 2
-horn- Doppelte Einträge entfernen, aus Array, List oder sonstwas Java Basics - Anfänger-Themen 9
G _NUR_ doppelte Einträge in einem Array behalten Java Basics - Anfänger-Themen 3
B Einträge im JList einfügen Java Basics - Anfänger-Themen 9
G doppelte Einträge im String Array löschen Java Basics - Anfänger-Themen 21
V Vector/Arraylist hat nur gleiche Einträge Java Basics - Anfänger-Themen 3
0 ArrayList - doppelte Einträge entfernen? Java Basics - Anfänger-Themen 9
S Methode, um doppelte Einträge in Array zu finden Java Basics - Anfänger-Themen 5
G Wie doppelte Einträge in ComboBox vermeiden ? Java Basics - Anfänger-Themen 9
M Doppelte Einträge in einer datei löschen(nach timestamp)! Java Basics - Anfänger-Themen 4
D Doppelte Einträge einer Liste löschen Java Basics - Anfänger-Themen 6
ARadauer Alle Einträge im Startverzeichnis Java Basics - Anfänger-Themen 5
B 2 ELists vergleichen und doppelte Einträge löschen Java Basics - Anfänger-Themen 11
M einträge farblich hervorheben ? Java Basics - Anfänger-Themen 8
M Vector soll keine doppelten Einträge enthalten! Java Basics - Anfänger-Themen 5
M Einträge einer .txt-Datei in einem TextField ausgeben lassen Java Basics - Anfänger-Themen 8
J Wie kann man im Systempopup einträge machen z.B im Explorer? Java Basics - Anfänger-Themen 6
K mehrere DB Einträge in einem JTable darstellen ?HILFE! Java Basics - Anfänger-Themen 2
G Array-Listen vergleichen und Einträge löschen ? Java Basics - Anfänger-Themen 4
S JList Einträge löschen Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
S Aus verschachtelter ArrayList auf einen Wert zugreifen Java Basics - Anfänger-Themen 4
O Rekursiver Durchlauf verschachtelter Elemente Java Basics - Anfänger-Themen 1
A Laufzeit von verschachtelter for-Schleife Java Basics - Anfänger-Themen 4
S problem bei verschachtelter for-schleife Java Basics - Anfänger-Themen 5
H java.lang.IndexOutOfBoundsException bei verschachtelter ArrayList Java Basics - Anfänger-Themen 9
F continue in verschachtelter Schleife Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben