स्पैगुएटी/कैक्टस स्टैक के बारे में पढ़ना मैं एक ऐसे संस्करण के साथ आया जो इस उद्देश्य के लिए सेवा कर सकता है, जिसमें किसी भी क्रम में अपनी चाबियों को मैप करने की संभावना शामिल है ताकि map.lookup ("a", "b") और मानचित्र .lookup ("बी", "ए") एक ही तत्व देता है। यह किसी भी कुंजी के साथ काम करता है न केवल दो।
मैं dataflow प्रोग्रामिंग के साथ प्रयोग करने के लिए एक ढेर के रूप में उपयोग लेकिन यहाँ एक त्वरित और गंदे संस्करण है जो (यह सुधार किया जाना चाहिए एक बहु कुंजी नक्शे के रूप में काम करता है: के डुप्लिकेट आवृत्तियों को देख से बचने के लिए इस्तेमाल किया जाना चाहिए सेट सरणियों के बजाय एक प्रमुख)
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
}
}
स्रोत
2014-06-04 17:14:43
क्या एबीसी, डी और एबी के लिए हैशकोड के कारण कोई समस्या है, सीडी समान है? या बराबर अलग संकल्प है कि? –
@smackfu: यह निर्भर करता है। यह केवल एक समस्या होगी यदि आपके पास तारों के ऐसे कई जोड़े हैं, क्योंकि वे तालिका में एक ही स्लॉट के लिए हैश और लुकअप कम कुशल बनाते हैं। – Tudor
@ ट्यूडर क्या आप किसी भी लाभ के बारे में सोच सकते हैं कि इस समाधान में एजसेज़ द्वारा प्रस्तुत समाधान पर है जो मूल रूप से केवल दो तारों को एक टिल्ड चरित्र से अलग करता है? – Zak