Map<String, Vector>?

TKausL

Top Contributor
Hallo.

Ich möchte eine art Freundesliste aufbauen.

Dazu habe ich mir folgendes Gedacht:

Java:
public Map<String, Vector> friendlist = new Map<String, Vector>();

d.h. jeder User bekommt einen eintrag in der Map, und im Vector zu dem User stehen dann die ganzen Freunde drin.

Leider nimmt Map den Type Vector nicht an. Hat jemand eine möglichkeit oder sogar eine Bessere idee die es ermöglicht, 2Dimensional Daten zu speichern außer in einem Array (da die Menge unbestimmt ist)?
 

hdi

Top Contributor
Dein Problem liegt nicht im Vektor, sondern darin dass du eine Map nicht instantiieren kannst. Map ist ein Interface. Du musst bei der Erzeugung per new eine Klassen-Instanz erzeugen. z.B.:

Java:
public Map<String, Vector> friendlist = new HashMap<String, Vector>();

Im Übrigen solltest du den Vektor auch parametrisieren - denn auch Vector ist generisch:

Java:
public Map<String, Vector<String>> friendlist = new HashMap<String, Vector<String>>();
 

thE_29

Top Contributor
Das Problem ist nicht der Vector, dass Problem ist das new Map!

Map istn INTERFACE und das kann man nicht instanzieren..

Du musst dir eine Implementierung von Map aussuchen: Hashtable, HashMap, etc..

Also zB

Java:
public Map<String, Vector> friendlist = new HashMap<String, Vector>();

Schon wieder zu langsam ;( :D
 

TKausL

Top Contributor
Dein Problem liegt nicht im Vektor, sondern darin dass du eine Map nicht instantiieren kannst. Map ist ein Interface. Du musst bei der Erzeugung per new eine Klassen-Instanz erzeugen.

Im Übrigen solltest du den Vektor auch parametrisieren - denn auch Vector ist generisch:

Zum 1.: Was macht es denn für einen Unterschied, ob ich
Java:
Map bla;

oder gleich

Java:
HashMap bla;

nehme?

zum 2.: Sollte, muss aber nicht daher konnte der Fehler da nicht dran liegen.


3.: Soweit ich mich erinnern kann, war HashMap eine art "Sortiertes 2D-Array" (Also was ich als 1. Einfüge wird auch immer auf Platz 1 bleiben), welches aber wieder mehr speicher braucht. Gab es nicht ein 2D Element welches diese Sortierung (Platz 1 bleibt Platz1) nicht unterstützt, dafür aber weniger Speicher braucht?

Edit: Sehe grade den 2. Post. War das nicht sogar HashTable oder was war da der unterschied?
 

thE_29

Top Contributor
Zu ad1) Naja, wenn du draufkommst, du willst eine andere Map Implementierung nehmen, dann musst du nur eine Stelle ändern...

Im Endeffekt, könnte man gleich HashMap schreiben, aber tjo..

Zum Unterschied: Steht alles in der Doku.. Hier kleine Auszug:

The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.

Dh, HashMap = nicht threadsafe und erlaubt NULL als Value!
Hashtable = threadsafe (synchronized) und wirft eine NPE wenn die Value NULL ist..
 

hdi

Top Contributor
Der Unterschied zwischen der Deklaration als Map vs HashMap ist, dass du im Falle von Map die konkrete Implementierung im Nachhinein austauschen kannst, ohne gleich den gesamten Code refactoren zu müssen. Das ist ein Grundprinzip von gutem OO-Design: Immer den möglichst abstraktesten Datentyp als deklarierten Datentyp wählen. Wenn du ne Klasse B extends A hast, überleg dir ob die Variable wirklich vom Typ B deklariert werden muss, oder ob du eh nur auf Methoden aus Klasse A zugreifst. Das selbe beim Interface: Solange du keine Methoden aufrufen willst, die nur die Klasse HashMap bietet, sondern lediglich Methoden die im Interface Map definiert sind, solltest du auch Map als deklarierten Typ verwenden. Wenn dir das nicht einleuchtet kann ich dir auch gerne ein Beispiel geben.

Und zur Parametrisierung von Vector: Ich weiß dass das kein (syntaktischer oder semantischer) Fehler ist. Ich wollte dich nur darauf aufmerksam machen dass man das besser designen kann. Du solltest Warnings (die zeigt dir Eclipse in diesem Falle nämlich an) nicht ignorieren.
 

TKausL

Top Contributor
Okay danke, letzte Frage :p

Ich möchte gerne Abfragen: Welche Freunde hat PETER. Das ist ja ohne weiteres Möglich aus der HashMap den Vector zu fischen und durchzuiterieren.

Allerdings möchte ich auch gerne wissen: Welche User haben PETER in der Freundesliste.

Dazu müsste ich also JEDEN Vector durchgehen nach Peter.

Gibt es da vieleicht eine einfachere, effektivere Möglichkeit oder soll ich sogar das ganze doppelt anlegen (einmal halt rückwärts)?

Es geht hier rein um die Schnelligkeit und den Speicherverbrauch. Dass die Möglichkeit alles durchzugehen funktioniert weiß ich.
 

TKausL

Top Contributor
Ich wollte es erstmal bei der Speichersparsameren Methode belassen.

Die Rückwärtsabfrage hatte ich mir eigentlich so gedacht:

Java:
		for(Vector<String> flist : friendlist.values()){

Dadrin gucke ich nun in den Vector, ob der Nick drin steht.
Wie allerdings bekomme ich nun den Nick, dem der Vector in der HashMap zugeordnet ist? ^^
 

Landei

Top Contributor
Java:
for(Map.Entry<String,Vector<String>> entry : friendlist.entrySet()){
   String key = entry.getKey();
   Vector<String> value = entry.getValue();
   ...
}
 

hdi

Top Contributor
Er hat durchaus Zugriffe über Keys, deswegen eine Map. Er will halt noch herausfinden können, welche Entries einen bestimmten Key als ihren eigenen Value haben. Und da er meinte:

Ich wollte es erstmal bei der Speichersparsameren Methode belassen.

müssen wir uns auf diese Map beschränken. Ist natürlich Quatsch, denn Speicher hat man heutzutage mehr als genug. Aber das muss er wissen :D
 

Neue Themen


Oben