Leggere sullo stack di spaguetti/cactus Mi è venuta una variante che potrebbe servire a questo scopo, inclusa la possibilità di mappare le chiavi in qualsiasi ordine in modo che map.lookup ("a", "b") e mappa .lookup ("b", "a") restituisce lo stesso elemento. Funziona anche con qualsiasi numero di chiavi, non solo due.
Io lo uso come una pila per sperimentare con la programmazione del flusso di dati, ma qui è una versione veloce e sporca che funziona come una mappa multi chiave (dovrebbe essere migliorata: set invece di array per evitare la ricerca di occorrenze duplicate di una chiave)
public class MultiKeyMap <K,E> {
class Mapping {
E element;
int numKeys;
public Mapping(E element,int numKeys){
this.element = element;
this.numKeys = numKeys;
}
}
class KeySlot{
Mapping parent;
public KeySlot(Mapping mapping) {
parent = mapping;
}
}
class KeySlotList extends LinkedList<KeySlot>{}
class MultiMap extends HashMap<K,KeySlotList>{}
class MappingTrackMap extends HashMap<Mapping,Integer>{}
MultiMap map = new MultiMap();
public void put(E element, K ...keys){
Mapping mapping = new Mapping(element,keys.length);
for(int i=0;i<keys.length;i++){
KeySlot k = new KeySlot(mapping);
KeySlotList l = map.get(keys[i]);
if(l==null){
l = new KeySlotList();
map.put(keys[i], l);
}
l.add(k);
}
}
public E lookup(K ...keys){
MappingTrackMap tmp = new MappingTrackMap();
for(K key:keys){
KeySlotList l = map.get(key);
if(l==null)return null;
for(KeySlot keySlot:l){
Mapping parent = keySlot.parent;
Integer count = tmp.get(parent);
if(parent.numKeys!=keys.length)continue;
if(count == null){
count = parent.numKeys-1;
}else{
count--;
}
if(count == 0){
return parent.element;
}else{
tmp.put(parent, count);
}
}
}
return null;
}
public static void main(String[] args) {
MultiKeyMap<String,String> m = new MultiKeyMap<String,String>();
m.put("brazil", "yellow", "green");
m.put("canada", "red", "white");
m.put("USA", "red" ,"white" ,"blue");
m.put("argentina", "white","blue");
System.out.println(m.lookup("red","white")); // canada
System.out.println(m.lookup("white","red")); // canada
System.out.println(m.lookup("white","red","blue")); // USA
}
}
fonte
2014-06-04 17:14:43
Ci sono problemi dovuti agli hashcode per ABC, D e AB, il CD è lo stesso? O gli uguali che sono diversi lo risolvono? –
@smackfu: Dipende. Sarebbe solo un problema se si hanno molte coppie di stringhe di questo tipo, perché si abbineranno allo stesso slot della tabella e renderanno le ricerche meno efficienti. – Tudor
@Tudor puoi pensare a qualche vantaggio che questa soluzione ha rispetto alla soluzione presentata da EdgeCase che sostanzialmente concatena le due stringhe separate da un carattere di tilde? – Zak