TreeMap mit mehreren gleichen Keys

wSam

Erfahrenes Mitglied
Hallo zusammen

Ich benutze eine TreeMap um eine Liste mit mehreren Objekten zu sortieren auf einen bestimmten String x eines Objektes.

So ala:

treemap.put(objekt.stringx(), objket);

Wenn es jedoch in dieser Liste mehrere Objekte mit dem gleichen String x hat, so wird ja das vorige Objekt in der TreeMap mit gleichem key = "x" überschrieben. Wie könnte ich dies verhindern ohne gross erst zu prüfen ob dieser key schon vorkommt?

Vielen dank im Voraus und Gruss
 
Hallo!

Code:
/**
 * 
 */
package de.tutorials;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author daritho
 * 
 */
public class MultiTreeMapExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map map = new TreeMap();

        // Alle elemente als Set innerhalb der Map verwalten...
        map.put("foo", new HashSet());
        ((Set) map.get("foo")).add("abc");
        ((Set) map.get("foo")).add("def");
        map.put("bar", "1234");

        System.out.println(map);

        // Map implementierung anpassen:
        map = new TreeMap() {
            public Object put(Object key, Object value) {
                if(containsKey(key)){
                    return super.get(key);
                }   
                return super.put(key, value);
            }
        };
        
        //Bei jakarta-commons Collections nachschauen...
        
    }
}
Ich denke um das Pruefen wirst du wohl nicht herum kommen. Fuer die Pruefung hast du mehrere Moeglichkeiten:
-> mit map.containsKey(...) Abfragen ob der Schluessel schon vorhanden ist, oder
-> den Rueckgabewert der map.put(..,...) Methode auswerten. War vor dem put schon ein Element mit diesem Schluessel vorhanden, so wird eine Referenz auf das vorherige Element zurueckgegeben. War der Schluessel hingegen noch nicht gesetzt wird null zurueckgegeben. (Wobei der Rueckgabewert null auch bedeuten kann, dass der Schluessel mit dem Wert null assoziiert war)

Gruss Tom
 
Mit contains() wird es ein bisschen ein gebastel, denn dann muss ich den key veränden.

Oder wie würdet Ihr eine ArrayList, welche n-Objekte hat, sortieren auf eine bestimmtes Feld aller Objekte (Feld des Objektes)? Hat jemand eine idee?

Danke im Voraus
 
Hallo!

Ich wuerde das so machen:
Code:
/**
 * 
 */
package de.tutorials;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author Tom
 *
 */
public class ArrayListComparator {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new A("a","i"));
        list.add(new A("z","k"));
        list.add(new A("g","j"));
        System.out.println(list);
        
        Collections.sort(list,new AabcComparator());
        System.out.println(list);
        Collections.sort(list,new AdefComparator());
        System.out.println(list);
    }
    
    static class A{
        String abc;
        String def;
        public A(String abc, String def) {
            this.abc = abc;
            this.def = def;
        }
        
        public String toString() {
            return super.toString() + " abc= " + this.abc +" def=" + this.def;
        }
    }
    
    static class AabcComparator implements Comparator{
        public int compare(Object o1, Object o2) {
            return ((A)o1).abc.compareTo(((A)o2).abc);
        }
    }
    
    static class AdefComparator implements Comparator{
        public int compare(Object o1, Object o2) {
            return ((A)o1).def.compareTo(((A)o2).def);
        }
    }

}

GrussTom
 
Zurück