# HashMap mit Iterator durchlaufen



## noch_anfänger (11. Nov 2009)

Hallo,

ich habe eine 
	
	
	
	





```
HashMap<String, Icon>
```
 und möchte die über eine Schleife durchlaufen, um die HashMap mit Icons einzufüllen. Es gibt eine 
	
	
	
	





```
while-
```
 Schleife, die mit dem Iterator über die Keys durchläuft.

```
HashMap<String, Icon> iMap = new HashMap <String, Icon>();
```


```
Iterator<String> itr = MyStorage.keySet().iterator();
```


```
String str;
```


```
while (itr.hasNext()) {
```


```
str = itr.next();
```


```
iMap.put(MyStorage.getName(str), icon);
```


```
}
```

Das Problem ist, dass die while-Schleife backwards arbeitet, beginned mit dem letzten Element.
Gibt es vielleicht eine andere Möglichkeit, etwa 
	
	
	
	





```
for each
```
, um die HashMap zuerst mit dem esrten Element von MyStorage zu füllen, dann mit dem Zweiten u s.w. ?


----------



## diggaa1984 (11. Nov 2009)

die Reihenfolge des Durchlaufs hat nix mit der while-schleife zu tun, sondern mit den Vorgaben des keySet-Typs

Es gibt Sets, welche eine Reihenfolge beim iterieren einhalten (LinkedHashSet) .. aber in der Regel kannst du davon ausgehen, dass die Reihenfolge zufällig ist. Wenn du Werte in deine HashMap einfügst, ist auch nicht sichergestellt das diese Reihenfolge auch beibehalten wird, das hat einfach mit der Eigenart der Hashmap zu tun, darauf hast du keinen Einfluss, ausser du nutzt eine LinkedHashMap.

Warum genau, möchtest du denn eine spezielle Reihenfolge abarbeiten?


----------



## ttplayer (11. Nov 2009)

Die HashMap wird beim Iterieren nicht alphabetisch durchlaufen, sondern nach dem HashCode des Strings - frag mich aber nicht, wie der aufgebaut ist... Wenn du es nach Reihenfolge machen willst, solltest du eine ArrayList nehmen.


----------



## Landei (11. Nov 2009)

Eine TreeMap hält seine Keys übrigens die ganze Zeit sortiert.


----------



## noch_anfänger (11. Nov 2009)

Hallo,

danke für die Antworten!
Die HashMap ist mir vorgegeben, ich darf es nicht ändern. Wenn ich MyStorage mit Elementen anfülle

```
MyStorage.addElement("first", ...);
MyStorage.addElement("second", ..);
MyStorage.addElement("third", ...);
```
und in meine Schleife jetzt 
	
	
	
	





```
System.out.println()
```
 reintun,

```
HashMap<String, Icon> iMap = new HashMap <String, Icon>();
Iterator<String> itr = MyStorage.keySet().iterator();
String str;
while (itr.hasNext()) {
str = itr.next();
System.out.println("str = " + str);
iMap.put(MyStorage.getName(str), icon);
}
```
bekomme ich in der Console:

```
str = third
```


```
str = second
```


```
str = first
```

Ich verstehe das so, dass in iMap die Sachen auch in dieser Reihenfolge abgelegt sind.

Ich brauche aber die normale Reihenfolge:

```
str = first
```


```
str = second
```


```
str = third
```


----------



## diggaa1984 (11. Nov 2009)

versuch mal

```
HashMap<String, Icon> iMap = new LinkedHashMap<String, Icon>();
```

das verletzt nix, weil nach aussen ist es immer noch als HashMap nutzbar
obwohl das problem eher beim Typ von von MyStorage liegt, von welchem Typ ist das?


----------



## ttplayer (11. Nov 2009)

Wenn das nicht funktioniert, dann weiß ich auch nicht, wie das funktionieren soll...
Poste doch mal deine Aufgabenstellung, vielleicht geht das ganz anders...


----------



## Leroy42 (11. Nov 2009)

diggaa1984 hat gesagt.:


> Wer aufhört, besser zu werden, hat aufgehört, gut zu sein. (Philip Rosenthal, 1916)




Interessant daß dieser Philip Philip Rosenthal

schon im zarten Alter von *0 Jahren* so etwas aussagekräftiges
gesagt haben soll.


----------



## diggaa1984 (11. Nov 2009)

das is offtopic  .. und er war einfach ne ausnahme ^^ ... hm ... google anwerf
edit: umgefallen .. is ja egal wann es war .. hab den stern vergessen


----------



## ttplayer (11. Nov 2009)

diggaa1984 hat gesagt.:


> obwohl das problem eher beim Typ von von MyStorage liegt, von welchem Typ ist das?


Also soweit ich das verstanden hab, ist MyStorage eine HashMap vom Typ <String, String>, wobei der erste Eintrag halt der Iconname ist und der zweite irgendwas anderes, das dann in iMap geschrieben wird.


----------



## noch_anfänger (11. Nov 2009)

diggaa1984 hat gesagt.:


> versuch mal
> 
> ```
> HashMap<String, Icon> iMap = new LinkedHashMap<String, Icon>();
> ...



Ic versuche das, danke für den Tip!


----------



## diggaa1984 (11. Nov 2009)

wie gesagt, ich glaube eher das problem liegt beim typ von MyStorage .. weil du über dieses Object iterierst!! 

das muss eine geordnete Iteration gewährleisten!


----------

