Map

Nirvana

Aktives Mitglied
Es soll das Wechselgeld in einem Kaffeautomaten berechnet werden.
Ein Kaffee kostet k Cent und es wird ein Betrag s Cent in einer bestimmten STückelung eingeworfen. Die Stückelung ist eine assoziative Liste (Map<Integer,Integer>) von Integer_Werten der STückelgröße zu deren Anzahl als Integer Wert.
Ausgabe: Gib eine assoziative Map w mit passendem Wechselgeld aus, also k=s-w. sodass so wenig Münzen wie möglich zurück gegeben werden.


Ich kann mir das Bsp so gar nicht vorstellen:
Ich stecke die Münzen in die Map hinein, diewerden dann geordndet also alle: 1 cent, alle 5 cent,alle 10 cent, 50 cent, 1 Euro, 2 Euro. Und danach wird das Wechselgeld aus den Stückelungen genommen und aus der Map geworfen.

Java:
w<Integer,Integer> map =new w<Integer,Integer>();
damit erzeuge ich eine Map.
Nun muss ich die arrays definieren für [1],[5],[10] .... wie mache ich das?
 

Nirvana

Aktives Mitglied
Das ist sie....-.

Es steht noch ein Bsp da also nochmal ganze Aufgabe kompakt:

Es soll das Wechselgeld in einem Kaffeautomaten berechnet werden.
Ein Kaffee kostet k Cent und es wird ein Betrag s Cent in einer bestimmten STückelung eingeworfen. Die Stückelung ist eine assoziative Liste (Map<Integer,Integer>) von Integer_Werten der STückelungsgröße zu deren Anzahl als Integer Wert.
z.B.:{s[1]:0,s[5]:3,s[10]:0,s[50]:0,s[100]:2,s[200]:0}
Diese bedeutet, dass keine 1-Cent Müne, 3-mal eine 5 Cent Münze, keine mit 10 oder 50 Cent, 2-mal eine 1 Euro Münze und keine 2-EUro Münze eingeworfen wurde. Beachte , der algoritmus soll mit einer beliebigen STückelung arbeiten können, dies ist nur ein Beispiel.
Ausgabe: Gib eine assoziative Map w mit passendem Wechselgeld aus, also k=s-w. sodass so wenig Münzen wie möglich zurück gegeben werden.
 

Marco13

Top Contributor
Spontan klingt das, als wäre die Stückelung bei der Eingabe ziemlich wurscht. Da kann man erstmal die ganze Map durchlaufen, und den bezahlten Betrag zusammenrechnen. Und für das Wechselgeld erstellt man wieder eine
Java:
Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
for (Alle benötigten Münzen m)
{
    Integer used = map.get(m);
    if (used == null)
    {
        map.put(m, 1);
    }
    else
    {
        map.put(m, used+1);
    }
}
... Nix mit array.... :bahnhof:
 

Nirvana

Aktives Mitglied
Ich verstehe nicht ganz was du in der forschleife machst, kannst du mir das kurz in einen satz erklären? Hab nämlich erst vor paar wochen mit java begonnen.
Du fragst den Wert des schlüssels m ab,wenn der null ist fügst du hinzu das SChlüsselwertpaar (m,1)
und sonst fügst du das SChlüssel-wert-paar (m, used+1) hinzu


Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
Muss statt LinkedHashMap nicht wieder Map stehen?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Map ist ein Interface. LinkedHashMap ist eine von vielen Implementierungen dieses Interfaces. (Mehr dazu ... kommt noch, oder im Netz suchen ... Du kannst ja mal versuchen nur "Map" zu schreiben ;))

In der Schleife wird gespeichert, welche Münze wie oft benötigt wurde: Angenommen, die Münze 'm' ist der Integer '10'. Dann wird in der Map nachgeschaut, ob der schon verwendet wurde. Wenn er noch NICHT verwendet wurde, ist used==null, und man speichert sich, dass er jetzt 1 mal verwendet wurde. Wenn used!=null ist, wurde die Münze schon 'used' mal verwendet - und man speichert sich, dass sie jetzt 'used+1' mal verwendet wurde.
 
N

nillehammer

Gast
Marco ist wohl schon schlafen gegangen, deswegen ich. :)
Du fragst den Wert des schlüssels m ab,wenn der null ist fügst du hinzu das SChlüsselwertpaar (m,1)
und sonst fügst du das SChlüssel-wert-paar (m, used+1) hinzu
Japp, Marco geht davon aus, dass Du irgendwie die für das Wechselgeld benötigten Münzen schon hast (bspw. in einem Array) über den iterierst Du dann. Du schaust anhand des Münzenwertes in der Map nach, wie oft Du die Münze schon verwendet hast. Kommt null heraus, hast Du sie noch garnicht verwendet, sonst ein Integer, der die entspr. Anzahl enthält. Je nachdem addierst Du dann bei der entsprechenden Münze eins dazu.

Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();
Muss statt LinkedHashMap nicht wieder Map stehen?
Nein, man kann garnicht
Code:
new Map
machen. Map ist ein sog, Interface. D.h. hier sind nur die Methoden definiert, die etwas, dass sich Map nennen will, haben muss. Linked HashMap ist eine sog. Implementierung des Map-Interfaces. Weil das so ist, kann man eine Instanz davon einer Variablen vom Typ Map zuweisen. Genau das mach Marco und so macht man es mit Interfaces in der Regel auch, sprich Variablentyp->Interface, Wertzuweisung mittels einer Implementierung.
[EDIT]
War er wohl doch wach und ich zu langsam... hab aber auch ausführlicher geantwortet ;)
[/EDIT]
 

Oben