Map (TreeMap in TreeMap)

  • Themenstarter Themenstarter Gelöschtes Mitglied 64159
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 64159

Gast
Hallo,
also mein Problem ist folgendes: So sieht meine Map aus "TreeMap<Integer, TreeMap<Double, Integer>> map = new TreeMap<>();"
Ich kriege es nicht hin den Wert dieser TreeMap (also die zweite/innere TreeMap) mit einem neuen Wert zu summieren. Ich belege den Schlüssel der äußeren Map mit einem Integer und falls dieser Schlüssel nicht in der Map(Zeile 15-19) vorhanden ist, soll er angelegt werden. Sollte der Schlüssel vorhanden sein, sollen die Werte addiert werden (dieses Addieren krieg ich nicht hin):
[CODE lang="java" title="TreeMap in TreeMap" highlight="2, 15-19"]public static void statistik(Scanner console, ArrayList<String> liste) {
TreeMap<Integer, TreeMap<Double, Integer>> map = new TreeMap<>();
int auswahl;
do {
auswahl = abfrage(console); // @auswahl sollen Artikel/Produkte sein
while (auswahl > 7 || auswahl < 0) {
System.out.println("Bitte eine Zahl zwischen 0 und 7 eingeben.");
auswahl = abfrage(console);
}
if (auswahl != 0) {
System.out.print("Zu welchem Preis? ");
double preis = console.nextDouble();
System.out.print("Wie viele Einheiten? ");
int einheiten = console.nextInt();
if (!map.containsKey(auswahl)) {
map.put(auswahl, new TreeMap<>());
}
TreeMap<Double, Integer> innereMap = map.get(auswahl);
innereMap.put(preis, einheiten);

}
} while (auswahl != 0);
System.out.println("Statistik (in der obigen Sortierung)" + "\n");
for (Integer wahl : map.keySet()) {
System.out.println("Statistik fuer " + liste.get(wahl));
TreeMap<Double, Integer> innereMap = map.get(wahl);
double summePreis = 0.0;
int summeArtikel = 0;
for (Double preis : innereMap.keySet()) {
System.out.println(" Einzelverkaeufe (nach Preis aufsteigend sortiert)");
System.out.println("\t" + innereMap.get(preis) + " Einheiten zu " + round2(preis) + " EUR");
summePreis += preis;
summeArtikel += innereMap.get(preis);
System.out.println(" Akkumulierte Werte:");
System.out.println("\t" + "Einheiten (gesamt): " + summeArtikel);
System.out.println("\t" + "Durschnittspreis: " + round2((summePreis * summeArtikel) / summeArtikel) + " EUR" + "\n");
}
}
}[/CODE]

Falls man den Text oben nicht verstehen sollte, versuche ich die Problemstellung etwas vereinfachter darzustellen:
@auswahl(Produkt) Wenn das Produkt nicht vorhanden ist, füge sie in die Map.
@auswahl(Produkt) Wenn das Produkt vorhanden ist, addiere @preis(Preis) und @einheiten(Menge) auf das vorhandene Produkt.


PS: die abfragen() Methode habe ich nicht mit reingenommen, diese gibt nur einen Integer vom Scanner wieder. Solltet ihr dennoch Code benötigen kann ich den Rest auch senden. Ist übrigens mein erster Thread, kann gut möglich sein, dass sehr viel Information fehlt oder der Einstieg generell einfach nur schlecht war.
Vielen Dank im voraus. MfG^^
 
Ich würde keine zweite Map verwenden, sondern einen expliziten Typen, der Preis und Menge zusammenfasst. Map ist für Schlüssel/Wert-Kombinationen gedacht, nicht für Wert/Wert-Kombinationen.
Java:
// das Beispiel erfüllt kein Kriterium für korrektes Klassendesign, nur damit du weißt, was gemeint ist!
class Artikel {
    public double preis;
    public int menge;
}

// mit

Map<Integer, Artikel> // ich geh davon aus, dass Integer eine Art Artikelnummer ist, sonst wäre es kein sinnvoller Schlüssel
Double als Schlüssel halte ich für fragwürdig, aber der würde dann ja eh entfallen.

Double für genaue Preisberechnung ebenso. Nimm stattdessen lieber int/long und berechne den Preis in Cent, also (anstatt 1.01 € = 101 ct).
 
Zuletzt bearbeitet:

Zurück
Oben