# Container für [key,value] elemente ?



## Guest (22. Nov 2008)

Hallo, 

gibt ein java Konstrukt, mit dem ich folgendes, eindeutige Datenstruktur [key, value] ablegen kann. um das ganze mal in "datenbanksprache" zu formulieren. key UND value sind quasi ein primärschlüssel. es soll also folgende ablage möglich sein: 

```
"1"  "Person 1"
"1"  "Person 2"
"1"  "Person 3"
"2"  "Person 1"
"2"  "Person 34"
```

Der Datensatz ["2"  "Person 1"] dürfte also nicht abgelegt werden. Mit einem Set oder einer Map scheint das nicht zu gehen, da hier der key eindeutig sein muss. ich brauche aber etwas, wo key und value eindeutig sind.

jemand ne Idee, ich weiß im moment nicht wie ich das anstellen soll.
Einen Gruß.


----------



## Guest (22. Nov 2008)

um es vielleicht nohcmal anders zu formulieren. Wenn ich mir aus diesem Container einen Datensatz holen möchte, brauche ich den key und den value, also ungefähr so:


```
container.get("1","Person 34");
```


----------



## maki (22. Nov 2008)

Map, zb. HashMap.


```
Map<Integer, String> myMap = new HashMap<Integer, String>();
	
	myMap.put(1, "Hans Meier");

	assert(myMap.get(1).equals("Hans Meier"));
```

Container heisst es in C++, unbedingt lesen:
http://java.sun.com/docs/books/tutorial/collections/index.html


----------



## Guest (22. Nov 2008)

Hm..
also ehrlich gesagt, ganz verstanden habe ich das nicht  :? 

Mein Problem ist, dass hier 1 ausgegeben wird, obowhl 3 ausgegeben werden sollte: 


```
import java.util.HashMap;
import java.util.Map;

public class MapTest {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
	    
		map.put("1", "Hans Meier");
		map.put("1", "Hans Mueller");
		map.put("1", "Hans Keller");

		System.out.println(map.size());
	}
}
```

wohingegen hier für map.size() 2 ausgegeben werden sollte, so stelle ich mir das vor


```
import java.util.HashMap;
import java.util.Map;

public class MapTest {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
	    
		map.put("1", "Hans Meier");
		map.put("1", "Hans Meier");
		map.put("1", "Hans Keller");

		System.out.println(map.size());
	}
}
```


----------



## maki (22. Nov 2008)

Auch noch lesen:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Map.html

Schlüssel sind "unique"


----------



## Guest (22. Nov 2008)

"An object that maps keys to values. A map cannot contain duplicate keys;"

Genau das ist ja mein Problem. Gibt es eine Datenstruktur in der sozusagen [key,value] Paare zusammen als Schlüssel ablegen werden können ? Gemäß dem obigen Fragment sollen also alle Daten eingefügt werden, deren key+value zusammen eindeutig ist, und nicht nur der key alleine. Das ist es doch  :?  :bahnhof:


----------



## maki (22. Nov 2008)

Ach so..

Beschreib mal genauer dein zu lösendes Problem, also wozu soll das gut sein?


----------



## Guest (22. Nov 2008)

Hallo, 
also ich würde das folgendermaßen machen: einfach eine List nehmen wo ich meine Objekte reinknalle und die contains Methode von List überschreiben. Hier ein Beispiel: (ohne Gewähr und Anspruch auf sauberste Lösung)


```
import java.util.ArrayList;
import java.util.List;

public class ListTest {

	public static void main(String[] args) {

		List<TestData>list = new ArrayList<TestData>(){			
			public boolean contains(Object arg0) {
				TestData other = (TestData)arg0;
				for (TestData data : this) {
					if (data.getObjid().equals(other.getObjid())&& data.getPerson().equals(other.getPerson())){					
						return true;
					}
				}
				return false;
			}
		};
		list.add(new TestData(1L,"Mueller"));
		list.add(new TestData(1L,"Maier"));
		list.add(new TestData(1L,"Bauer"));		
		
		TestData check = new TestData(1L,"Mueller");		
		System.out.println(list.contains(check));		
		
	}
}

class TestData {
	private Long objid;
	private String person;
	
	public TestData(Long objid, String person){
		this.objid = objid;
		this.person = person;
	}

	public Long getObjid() {
		return objid;
	}

	public void setObjid(Long objid) {
		this.objid = objid;
	}

	public String getPerson() {
		return person;
	}

	public void setPerson(String person) {
		this.person = person;
	}	
	
}
```


In der Praxis würdest du beim Füllen deiner Liste mit contains z.B. in einer Schleife überprüfen ob das Element
schon enthalten ist.  So hast du zum Schluss deine Liste in der nur "eindeutige"  Testdaten sind. Hoffe das hilft.

Grundsätzlich gilt aber immer alles was man vor hat, 2 mal zu überdenken, da es oft einfachere Lösungen gibt, wie ich selber immer wieder feststelle.

robobot.


----------

