Ich lese durch eine CSV und speichern die Daten in Objekte (ein Objekt wird für jede Zeile erstellt). Die Zeilen in der CSV werden nach dem ersten Element (Gruppennummer) gruppiert - irgendwo zwischen 2-10 Zeilen teilen sich eine Gruppennummer. Es gibt ~ 180 Gruppen im Datensatz. Um diese Daten leichter zu verarbeiten, speichere ich die Daten in HashMaps, wobei der Schlüssel die Gruppennummer ist und der Wert, der mit dem Schlüssel verknüpft ist, eine ArrayList der Datenobjekte ist.HashMap Funktion 'put' funktioniert nicht richtig - Java
Während ich durch die CSV-Zeilen iteriere, füge ich der HashMap Objekte hinzu und verwende die Gruppennummer der Zeile, um zu bestimmen, wo das neue Datenobjekt abgelegt werden soll. Wenn das Objekt eine Gruppennummer hat, die noch nicht in die CSV-Datei eingegeben wurde, erstellt es einen neuen Schlüssel (seine Gruppennummer) und eine ArrayList mit Datenobjekten, die nur sich selbst enthalten.
Wenn die Gruppennummer der Zeile ein Schlüssel in der HashMap ist, wird die ArrayList an die Gruppennummer gebunden, das neue Datenobjekt hinzugefügt und die put -Funktion verwendet, um den neuen Eintrag erneut hinzuzufügen ArrayList (jetzt mit einem weiteren Dateneintrag, der an die freigegebene Gruppennummer gebunden ist).
Code-Beispiel:
ArrayList<CSVData> csvListNew = new ArrayList<CSVData>();
HashMap<Integer,ArrayList<CSVData>> CSVDataMapNew = new HashMap<Integer,ArrayList<CSVData>>();
while ((line = reader.readLine()) != null && !(line.contains(",,,,,,,,,")))
{
System.out.println(line);
String[] csvDataNew = line.split(",");
String currentGroup = csvDataNew[GroupIndex];
try {
currentGroupNumber = Integer.parseInt(currentGroup.replace("group", "").replace(" ", ""));
} catch (Exception ex) {
currentGroupNumber = previousGroupNumber;
}
String path = csvDataNew[PathIndex];
startLine = Integer.parseInt(csvDataNew[StartLineIndex]);
endLine = Integer.parseInt(csvDataNew[EndLineIndex]);
CSVData data = new CSVData(currentGroupNumber, path, startLine, endLine);
if (CSVDataMapNew.containsKey(currentGroupNumber)) { //if it does contain the current key, add the current object to the ArrayList tied to it.
csvListNew = CSVDataMapNew.get(currentGroupNumber);
csvListNew.add(clone);
CSVDataMapNew.put(currentGroupNumber, csvListNew);
} else { //if it doesnt contain the current key, make new entry
csvListNew.add(clone);
CSVDataMapNew.put(currentGroupNumber, csvListNew);
System.out.println(CSVDataMapNew.size());
System.out.println(CSVDataMapNew.get(currentGroupNumber).size());
}
csvListNew.clear(); //to make sure no excess objects are entered into the map.
previousGroupNumber = currentGroupNumber;
}
Es gibt entsprechende Try-Fänge usw. und die CSVDataTable in seiner eigenen Klasse deklariert, statisch verwiesen wird.
Das Problem ist, wenn ich Druckanweisungen bei jedem Schritt hinzufüge, wird es wie jede ArrayList in der HashMap am Ende jeder Schleife gelöscht. Sobald die CSV-Datei fertiggestellt ist, hat sie also alle Schlüsselwerte, aber die mit jedem Schlüssel verknüpften ArrayLists sind alle leer. (Evidenced durch Schleifen durch die HashMap nachher).
Wie kann ich dies lösen, wenn ich also einen Wert in die ArrayList eingib und den Schlüssel und die aktualisierte ArrayList in die Map lege, behält sie ihre Daten?
ändern 'csvListNew.clear();' auf 'csvListNew = new Arraylist();'. So wie Sie es jetzt haben, legen Sie jedes Mal dieselbe Liste in die Karte. Und Sie löschen es jedes Mal am Ende Ihrer Schleife. –
Ihr Code ist schwer zu lesen. Warum haben Sie das eine Objekt 'CSVDataMapNew' großgeschrieben? Es sieht so aus, als ob Sie mit einer statischen Klasse arbeiten. –
"Das Problem ist, wenn ich in jedem Schritt Druckanweisungen hinzufüge, wird es wie jede ArrayList innerhalb der HashMap am Ende jeder Schleife gelöscht." - Nun ja, du nennst 'clear()' auf der Liste, deren Referenz du gerade in die Map gelegt hast ... –