Datenstruktur

pinsleepe

Mitglied
Hallo,
ich habe mal wieder eine Anfängerfrage :new
Ich habe ein Array, das ich auslese.

Die Elemente sehen z.B. so aus
"db1_typ2", "db2", "db1_typ7", "db9_typ7"
Anhand dessen, was vor dem "_" steht(falls vorhanden), weiß ich wie eine Datenbank heißt.
Das Andere ist eine Information über den Typ der Db (keine Info ist auch eine Info).

Ich suche nach einer Datenstruktur, in der ich die Zugehörigkeit abspeichern könnte, also z.B.
typ2 -> db1
typ7 -> db1, db9
usw.

Ich dachte an eine Map, sehe aber, dass ein Schlüssel nur einmal vorkommen darf(logisch). Ich könnte die Werte natürlich vorher z.B. in einem Set abspeichern und dann eine Map<String, Set> anlegen aber ich möchte nicht für jeden Typ einen Set anlegen müssen (ich weiß vorher nicht wie viele typen es überhaupt gibt..). Geht das 'on the fly'?
 
Ich mache mir dafür immer eine Util-Methode:

Java:
public static void addToMultiMap(Map<String, Set<String>> map, String key, String value){
    Set<String> s = map.get(key);
    if(s == null){
        s = new Set<String>();
        map.push(key,s);
     }
     s.add(value);
}

Oder generisch:
Java:
public static <K,V> void addToMultiMap(Map<K, Set<V>> map, K key, V value){
    Set<V> s = map.get(key);
    if(s == null){
        s = new HashSet<V>();
        map.push(key,s);
     }
     s.add(value);
}
 
Hallo,
danke für den Gedankenstoß :)

Ich habe es noch etwas verändert zu:
Java:
  public static <K,V> void add2Map(Map<K, Set<V>> map, K key, V value)
  {
    if (!map.containsKey(key))
    {
      Set<V> add = new HashSet<V>();
      map.put(key, add);
    }
    map.get(key).add(value);
  }
Sollte wahrscheinlich schneller gehen. Danke nochmals!
 
Hmm, naja du verwendest drei Zugriffe auf die Map und ich nur zwei. Ich denke weniger Zugriffe sind schneller.
 
Benutzt du wirklich nur 2 Zugriffe? Ich sehe drei: in den Zeilen 2,5,7. (Bin ein blutiger Anfänger, also bitte korrigieren wenn ich mich täusche).
Ausserdem kriegst du eine NullPointerException wenn der Schlüssel nicht vorhanden sein sollte ...

Ich habe noch eine neue Frage. Meine Struktur hat sich etwas vergrößert und es ist ein drittes Element dazu gekommen.
Was ist billiger:
Code:
Map<String, Map<String, HashSet<String>>>
oder zweimal
Code:
Map<String, HashSet<String>>
? Es ist so zu verstehen, dass ein Typ mehrere Untertypen hat und jeder von diesen Untertypen noch eine Menge an Werten.
Gut daran find ich, dass ich schnell anhand der (beiden) Schlüssel an die Blätter komme, aber es gibt auch einen Anwendungsfall wo ich nach einem bestimmten Wert suchen muss und angeben für welche Untertypen er existiert.
Was würdet ihr raten?
 
Zurück