L'ho già fatto. È una multi-mappa ordinata ed è solo una TreeMap di oggetti List. Ti piace questa ..
Map<KeyType, List<ValueType>> mmap = new TreeMap<KeyType, List<ValueType>>();
È necessario costruire una nuova LinkedList ogni volta che viene introdotta una nuova chiave, quindi potrebbe essere utile ad avvolgerla in una classe contenitore personalizzato. Cercherò di trovare qualcosa.
Quindi, ho gettato questo contenitore personalizzato insieme rapidamente (completamente non testato), ma potrebbe essere quello che stai cercando. Tieni presente che dovresti utilizzare questo tipo di contenitore solo se stai veramente cercando una mappa ordinata di elenchi di valori. Se esiste un ordine naturale dei valori, è necessario utilizzare un set di alberi come suggerito da altri.
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class MTreeMap<K, V> {
private final Map<K, List<V>> mmap = new TreeMap<K, List<V>>();
private int size = 0;
public MTreeMap() {
}
public void clear() {
mmap.clear();
size=0;
}
public boolean containsKey(K key) {
return mmap.containsKey(key);
}
public List<V> get(K key) {
return mmap.get(key);
}
public boolean isEmpty() {
return mmap.isEmpty();
}
public Set<K> keySet() {
return mmap.keySet();
}
public Collection<List<V>> valueLists() {
return mmap.values();
}
public void put(K key, V value) {
List<V> vlist = mmap.get(key);
if (null==vlist) {
vlist = new LinkedList<V>();
mmap.put(key, vlist);
}
vlist.add(value);
++size;
}
public List<V> remove(Object key) {
List<V> vlist = mmap.remove(key);
if (null!=vlist) {
size = size - vlist.size() ;
}
return vlist;
}
public int size() {
return size;
}
public String toString() {
return mmap.toString();
}
}
Ecco un test rudimentale:
public class TestAnything {
public static void main(String[] args) {
MTreeMap<Integer, String> mmap = new MTreeMap<Integer, String>();
mmap.put(1, "Value1");
mmap.put(2, "Value2");
mmap.put(3, "Value3");
mmap.put(1, "Value4");
mmap.put(3, "Value5");
mmap.put(2, "Value6");
mmap.put(2, "Value7");
System.out.println("size (1) = " + mmap.get(1).size());
System.out.println("size (2) = " + mmap.get(2).size());
System.out.println("size (3) = " + mmap.get(3).size());
System.out.println("Total size = " + mmap.size());
System.out.println(mmap);
}
}
Il risultato è questo:
size (1) = 2
size (2) = 3
size (3) = 2
Total size = 7
{1=[Value1, Value4], 2=[Value2, Value6, Value7], 3=[Value3, Value5]}
Se due elementi hanno la stessa coordinata Y, quello che si ** ** put primo? C'è un altro criterio? – OscarRyz