# key - value Struktur in ArrayList



## --- (17. Jan 2009)

Hallo,

also ich habe das Problem, wie ich den Inhalt einer Map (mit mehrfachvorkommenden key-values) in einer ArrayList speichern kann.

Ich habe folgende Map:

```
Map<String,Collection<String>> fileContent = new HashMap<String, Collection<String>>();

..                
 fileContent.put(key, values); //Debug: in fileContent stehen die richtigen Werte für key und value
  mapEntries = new ArrayList();

    //1. Versuch
  mapEntries.addAll(fileContent.keySet()); //Debug: in mapEntries nur die keys kein value
    //2. Versuch
  mapEntries.addAll((Collection)fileContent); //java.util.TreeMap cannot be cast to java.util.Collection
```
Gibt es eine andere Methode mit der ich key + value, also jeden Eintrag von fileContent dem mapEntries geben kann?

schon malvielen Dank, weis echt nicht weiter..


----------



## hdi (17. Jan 2009)

Du kannst kein Tupel <Key,Value> in einer ArrayList speichern, weil du nicht aus zwei Dingen eins machen kannst.
Bzw. natürlich kannst du, musst dir aber eine eigene Klasse schreiben á la:


```
class KeyValue{
   Object Key, value;
   public KeyValue(Object key, Object value){
         this.key = key;
         this.value = value;
   }
   // getKey(), getValue()
}
```

Und dann die Liste mit solchen Objekten befüllen:


```
Set<String> set = fileContent.keySet();
Iterator iter = set.iterator();
while(iter.hasNext()){
        Object key = iter.next();
	mapEntries.add(new KeyValue(key,fileContent.get(key));
}
```


----------



## --- (17. Jan 2009)

Danke!


----------



## Marco13 (17. Jan 2009)

hdi hat gesagt.:
			
		

> Bzw. natürlich kannst du, musst dir aber eine eigene Klasse schreiben á la:
> 
> 
> ```
> ...



Da sollte man dann noch dazuerwähnen, dass man bei dieser Klasse die equals- und hashCode-Methoden passend überschreiben sollte - GROB so

```
public boolean equals(Object object)
{
    if (this == object) return true;
    if (object == null) return false;
    if (object instanceof KeyValue)
    {
        KeyValue other = (KeyValue)object;
        return this.key.equals(other.key) && this.value.equals(other.value); // Ggf. noch check auf null!
    }
    return false;
}


public int hashCode()
{
    return key.hashCode() + 31 * value.hashCode(); // Ggf. noch check auf null!
}
```

Ansonsten würde sowas wie
list.add(new KeyValue("A","B"));
System.out.println(list.contains(new KeyValue("A","B"))); 
nämlich *false* ausgeben!


----------

