# HashMap



## CroweHammer (15. Mai 2009)

Hi Leute,

ich hab die Aufgabe ein logfile eines Schlüsselaus-und eingabe Programms auszuwerten.
Ich lasse das logfile einmal durchlaufen Zeile für Zeile, so und jetzt das eigentliche Problem. Das logfile speichert die Daten eines ganzen Tages, d.h. jeder Schlüssel kann ein paar mal ausgegeben und zurückgegeben werden.

Wenn z.B. der Schlüssel mit der Nummer "1" im logfile entdeckt wird, soll entweder ein interner counter um eins erhöht werden und die Zahl in die HashMap eingetragen oder bei einer Ausleihe die Ausleihzeit in die HashMap eingetragen werden.
Wenn das logfile also einmal durchlaufen ist, sollen in der HashMap hinterher alle Schlüssel mit ihren Ausleihzeiten und Ausgaben stehen, damit ich die HashMap hinterher auswerten kann und in eine .txt schreiben kann, dies lasst aber mal eine Sache sein ;-)
So könnt Ihr euch es vorstellen, wie die HashMap hinterher aussehen soll:

1, {1, 123423, 2, 162312, 3, 203845}
2, {1, 063412, 2, 124534}
3, {1, 235434}

Wie Ihr hier dran sehen können bei jedem Schlüssel unterschiedlich viele Ein-und Ausgaben pro Tag entstehen. Die Ausleihzeit speicher ich als Integer, in die HashMap, also nicht wundern, dass keine Doppelpunkt(12:34:23) oder ähnliches dazwischen sind.

Jetzt hier noch meine HashMap:
HashMap<Integer, Integer[]> hashMap = new HashMap<Integer, Integer[]>();

Ist das umsetzbar? Wenn ja wie schaffe ich es, dass wenn ein Schlüssel im logfile gefunden wird, entweder der counter erhöht oder die Ausleihzeit, für diesen Schlüssel, in das Integer Array in der HashMap angehängt wird? Nach Durchlauf meines Programms, soll die HashMap also soviele Zeilen haben, wie Schlüssel in dem logfile vorkommen.

Ich weis es is harte Kost, aber ich hoffe Ihr könnt mir weiterhelfen und ich habe es einigermaßen verständlich erklärt ;-)

Gruß Patrick


----------



## SlaterB (15. Mai 2009)

da du nicht weißt, wie viele Elemente pro Schlüssel da sind, empfehle ich dynamischer
Map<Integer, List<Integer>>

umsetzbar ist das, ja

---------

was es mit dem Counter auf sich hat, ist noch nicht klar,
ich nehme an, du analysierst in einer Schleife eine Log-Zeile und hast dann
Integer key = ..;
Integer value = ..;
dann kannst du an dieser Stelle die Map aktualsieren oder irgendwas mit deinem counter machen
oder beides oder nichts davon,

was ist die Frage, wovon hängt das ab, was ist das Problem?


----------



## HLX (15. Mai 2009)

Du solltest ein Objekt mit allen erforderlichen Informationen anlegen.


```
public class KeyInfo {

      private Integer id;
      private List<Date> time;

      // getter + setter

}
```

Dieses Objekt speicherst du unter der Id in der HashMap. Bei Veränderungen kannst du es aus der HashMap holen und den counter oder die Zeit anpassen.

Edit: counter entfernt. Bei Ausleihen, einfach ein Datum hinzufügen. Die Ausgabe kann durch Iteration über die Liste erfolgen (Methode toString).


----------



## CroweHammer (15. Mai 2009)

@ Slater, wenn ich eine List verwende, wie muss dann mein hashMap.put... Befehl aussehen.

Also wenn z.B. der Schlüssel "23" zurückgegeben wird, soll die hashMap an Stelle Key(in dem Fall 23) aktualisiert werden.
Sprich bei einer Rückgabe wird eben der counter(jeder Schlüssel muss natürlich einzeln hochgezählt werden) hochgezählt und die Zahl an die Liste angehängt werden, die der counter zurückgibt und bei einer Ausleihe wird die Zeit an die Liste angehängt. 
Ich brauche den counter nur wegen einer späteren Auswertung, in der ich die Anzahl brauche der Rückgaben an einem Tag ;-)
Mein Problem ist das anhängen, an der Stelle Key(in dem Fall 23), ich weis mir immer nur mit überschreiben zu helfen, und nicht anhängen.


----------



## SlaterB (15. Mai 2009)

was der Counter ist und macht, und ob er in irgendeinem Zusammenhang mit der Map oder diesem ganzen Thema steht,
habe ich nach wie vor nicht verstanden,
ist der counter  exakt gleich die Anzahl der Elemente in der Liste pro Key?

Integer key = ..;
Integer value = ..;
Liste l = liste aus map holen
(wenn l null, dann neu erzeugen und in Map speichern)
value in Liste l speichern


----------



## CroweHammer (15. Mai 2009)

Der Counter zählt wie oft jeder Schlüssel zurückgegeben wurde. 
Also nein nicht gleich der Anzahl an Elementen in der Liste ;-) und wie hole ich die Liste aus der HashMap?
Es geht mir einfach nicht in Kopf rein.

Danke, für deine/eure Hilfe


----------



## SlaterB (15. Mai 2009)

na so wie du jedes Objekt aus einer Map holst,
API lesen oder Tutorials/ Lehrbücher oder einfach mal bei google/ hier im Forum nach Beispielcode mit Maps suchen musst du schon selber


----------



## CroweHammer (15. Mai 2009)

okay, ich mach mich am Montag dran, weil ich dann wieder im Geschäft bin. Bin grad noch an einem PHP Projekt nebenher, wenn ich soweit bin und wieder vor Probleme stehen werd ich mich hier melden.
Wünsche euch ein angenehmes Wochenende und für die Arbeitenden einen schönen Feierabend.
Gruß Pat


----------



## CroweHammer (26. Mai 2009)

So ich bin ein Stück weitergekommen. Ich hab jetzt folgende HashMap verwendet:

private static HashMap<Integer, ArrayList<String[]>> hashMap;

Allerdings stehe ich jetzt vor dem großen Rätsel, wie ich die Werte in der hashMap am Ende ausgeben kann, weil wenn ich Sie über get(key) anspreche, bekomme ich nur sowas [[Ljava.lang.String;@addbf1], wie man es von hashMaps eben kennt? Man muss wahrscheinlich den Weg über eine Collection nehmen, habe schon soviel probiert aber bekomme es einfach nicht ausgegeben 

Könnt ihr mir weiterheilfen?


----------



## faetzminator (26. Mai 2009)

Das ist die toString() Methode vom String[], warum brauchst du da String[]? Was ist an
private static Map<Integer, List<Integer>> map;
nicht ok?


----------



## CroweHammer (26. Mai 2009)

Weil ich die Zeiten, erstmal als String reinschreiben will, also in der Form: 00:12:33
Wenn ich nämlich das Ganze in ein Integer umwandle wäre das ja theoretisch sowas 001233, aber letzten endes gibt er dann 1233 aus, wie das bei Integer so üblich ist und weil ich später mit dem DateFormat weiterarbeite, ist es praktisch wenn ich schon folgende Form vorliegen habe. Daher ist meine Wahl auf die neue Art der HashMap gefallen.

Ich hab es mal wie folgt probiert, aber gibt das oben in meinem ersten post genannte aus:

for(int i = 0; i < 600; i++)
{
  if(hashMap.containsKey(i))
  {
     System.out.println(hashMap.get(i).toString());
  }
}


----------



## faetzminator (26. Mai 2009)

Wenn schon, dann so:
--> Du kannst immer noch kein "sinnvolles" String[] ausgeben!

```
for(int i = 0; i < 600; i++) {
    if(hashMap.containsKey(i)) {
        String[] str = hashMap.get(i);
        for (String s : str) {
            System.out.println(f);
        }
    }
}
```


----------



## CroweHammer (26. Mai 2009)

Danke, damit kann ich meine nötigen Testergebnisse erstmal überprüfen, für die Auswertung am Ende, werde ich mir wohl noch etwas komfortableres ausdenken müssen 


```
for(int i = 0; i < 600; i++)
{
  if(hashMap.containsKey(i))
  {
    ArrayList<String[]> str = hashMap.get(i);
    for(String[] s : str)
    {
      for(int j = 0; j < s.length; j++)
      {
        System.out.println(i+" "+s[j]);
      }
    }
  }
}
```


----------

