Wie kann ich ein map mit Duplikaten implmentieren.

Status
Nicht offen für weitere Antworten.
S

Silvia

Gast
Ich brauche ein Map, wo ich Dupplikaten einfügen will.
(String, Integer)
Hat jemand einen Vorschlag?
 
S

Silvia

Gast
Danke für die Antworten.

So sollte es aussehen.

XXX, 2
XXX, 3
YYY, 5
XXX, 17

Ich möchte möglich keine zusätzliche Klassen verwenden.
 

Marco13

Top Contributor
Diese MultiKeyMap sieht ja murksig aus :?

@Topic: Kommt drauf an, was damit gemacht werden soll...
map.put("Hallo", new Integer(3));
map.put("Hallo", new Integer(4));
Integer i = map.get("Hallo"); // Welchen Wert soll i jetzt haben?
 
S

SlaterB

Gast
sprichst du von der MultiValueMap?

> Getting a value will return a Collection, holding all the values put to that key.

edit: ach, das war eine Frage
 
S

Silvia

Gast
@AMarco13 und anderen,

Ich brauche die beide Werte, damit ich nachchher alle Werte für "Hallo" zusammen addiere.

Ein Datenbank kommt bei mir nicht in der Frage!
 
G

Guest

Gast
Eine normale Map gibt sowas nicht her, ist jedoch ganz einfach zu modifizieren. Leg einfach nicht einzelne Integer zu einem Key ab sondern leg eine List dazu ab und speichere in der List die Integer.

Code:
Map<List> m = new HashMap<List>(),
int aa = 0;
int ba = 1;
int ca = 2;
int ac = 3;
int bb = 4;

List<Integer> aList = new ArrayList<Integer>();
aList.add(new Integer(aa));
aList.add(new Integer(ac));

m.put("a", aList);

Nur grob, wenn du jetzt nachträglich noch einen Wert ab = 9 mit ablegen willst machst du einfach:

Code:
List<Integer> list = m.get("a");
list.add(new Integer(ab));
m.put("a", list);

// Oder ganz kurz

m.put("a", m.get("a").add(new Integer(ab)));

Ist aus dem Kopf hin geschrieben, sollte aber eigentlich gehen.
 

Marco13

Top Contributor
Dann köntnest du die MultiValueMap nehmen, ist aber auch schnell selbst geschrieben. Beim Reinlegen muss man halt schaun, ob es schon eine Liste für den jeweiligen String gibt, und andernfalls eine erstellen und reinlegen.
Code:
private Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

private void doPut(String s, Integer i)
{
    List<Integer> list = map.get(s);
    if (list == null)
    { 
        list = new ArrayList<Integer>();
        map.put(s, list);
    }
    list.add(i);
}

...
    doPut("Hallo", 1);
    doPut("Hallo", 2);
    doPut("Hallo", 3);

    List<Integer> list = map.get("Hallo");
    int sum = 0;
    for (int i : list) sum += i;
    System.out.println(sum); // Gibt 6 aus
 
G

Guest

Gast
Wie Marco schon sagt ist eine solche Klasse auch schnellst selbst geschrieben:

Code:
public class MyMultiValueMap<K, V> {
   
   private Map<K, List<V>> _data;
   
   public MyMultiValueMap() {
      _data = new HashMap<K, List<V>>();
   }
   
   public void put(final K key, final V value) {
      put(key, value, true);
   }
   
   public void put(final K key, final V value, final boolean bAppend) {
      List<V> list;
      if (bAppend && _data.containsKey(key)) {
         list = _data.get(key);
         list.add(value);
         _data.put(key, list);
      } else {
         list = new ArrayList<V>();
         list.add(value);
         _data.put(key, list);
      }
   }
   
   public List<V> getValues(final K key) {
      return _data.get(key);
   }
   
   public boolean containsKey(final K key) {
      return _data.containsKey(key);
   }
   
   public List<K> containsValue(final V value) {
      // Wenn _data null oder leer ist wird direkt null zurück gegeben
      if (_data == null || _data.isEmpty()) {
         return null;
      }
      
      List<K> retList = null;
      Iterator<K> it = _data.keySet().iterator();
      K key;
      while(it.hasNext()) {
         key = it.next();
         if (_data.get(key).contains(value)) {
            if (retList == null) {
               retList = new ArrayList<K>();
            }
            retList.add(key);
         }
      }      
      return retList;
   }
   
   public void clear() {
      _data.clear();
   }
   
   public List<K> getKeys() {
      // Wenn _data null oder leer ist wird direkt null zurück gegeben
      if (_data == null || _data.isEmpty()) {
         return null;
      }
      
      List<K> retList = new ArrayList<K>();
      Iterator<K> it = _data.keySet().iterator();
      while (it.hasNext()) {
         retList.add(it.next());         
      }
      return retList;
   }
}

Hier habe ich jetzt aber schon auf Generics aufgebaut, kann also sein, dass du ggf. noch was anpassen müsstest und die ganzen K dann durch String bzw. die V durch Integer ersetzen müsstest.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben