2010-12-14 11 views
12

मैं पहले से ही पता है कि यह मुश्किल तरीके से कैसे करना है और यह काम कर रहा मिला - प्रविष्टियों से अधिक पुनरावृत्ति और अदला-बदली "मैन्युअल"। लेकिन मुझे आश्चर्य है कि, इतने सारे कार्यों की तरह, इसे एक और अधिक सुरुचिपूर्ण तरीके से हल किया जा सकता है।एक मानचित्र में कुंजी और मूल्यों स्वैप करने के लिए कैसे सुंदर ढंग से

मैं this post पढ़ा है, दुर्भाग्य से यह सुरुचिपूर्ण समाधान की सुविधा नहीं है। मुझे किसी फैंसी गुवा बायमैप्स या जेडीके के बाहर कुछ भी उपयोग करने की कोई संभावना नहीं है (प्रोजेक्ट स्टैक पहले ही परिभाषित है)।

मैं मान सकते हैं कि मेरी नक्शा द्विभाजित है, btw :)

+3

एक अतिरिक्त उपयोगिता पुस्तकालय जोड़ना वास्तव में परियोजना "ढेर" जिस तरह यूआई ढांचे आप होगा का उपयोग कर रहे है कि (माना) बदलते में कोई परिवर्तन नहीं किया गया है।मैं आपको * सभी * संभव होने पर गुवा का उपयोग करने के लिए अपने विरोध पर पुनर्विचार करने का आग्रह करता हूं। –

+0

आपको केवल एक ही लूप की आवश्यकता है, एक सिंगल लाइन सरल और सुन्दर है। IMHO। जावा एक कार्यात्मक भाषा नहीं है। –

+0

उन सभी को धन्यवाद, उन सभी ओवरलैपिंग और संक्षिप्त उत्तरों के साथ वास्तव में एक कठिन समय चुनना है कि कौन सा स्वीकार करना है। मुझे लगता है कि एक आवरण डिज़ाइन प्रदान करने के लिए बीमार हारून डिगुल्ला के साथ जाना। – kostja

उत्तर

8

मानक एपीआई/जावा रनटाइम एक द्वि-दिशात्मक नक्शे प्रदान नहीं करता है, इसलिए केवल समाधान सभी प्रविष्टियों से अधिक पुनरावृति और उन्हें मैन्युअल रूप से स्वैप करने के लिए है।

आप क्या कर सकते हैं एक रैपर वर्ग बनाते हैं जिसमें दो मानचित्र होते हैं और जो आंतरिक रूप से दोहरी put() करता है ताकि आपके पास डेटा पर दो बार तेज दिखाई दे।

[संपादित करें] इसके अलावा, धन्यवाद स्रोत खोलने के लिए, आप एक तीसरी पार्टी पुस्तकालय शामिल करने के लिए की जरूरत नहीं है, तो आप बस कक्षाएं आप अपने खुद के परियोजना में की जरूरत है कॉपी कर सकते हैं।

3

मैप्स सूची, जो पूंछ के साथ सिर स्वैप करके उल्टा हो सकता है की तरह नहीं हैं। नक्शे में

वस्तुओं एक गणना स्थिति है, और कुंजी के रूप में मूल्य और मूल्य के रूप में कुंजी का उपयोग कर भंडारण जगह फिर से गणना करने के लिए, essentialy एक और नक्शा निर्माण requiere होगा। कोई सुरुचिपूर्ण तरीका नहीं है।

हालांकि, द्विपक्षीय मानचित्र हैं। वे आपकी जरूरतों के अनुरूप हो सकते हैं। मैं तीसरे पक्ष के पुस्तकालयों का उपयोग कर पुनर्विचार करना चाहता हूं।

2

कुछ नौकरियों एक निश्चित बिंदु तक सरल किया जा सकता है कि और कोई और अधिक कर रहे हैं। यह उनमें से एक हो सकता है!

यदि आप जावा संग्रह एपिस का उपयोग करके नौकरी करना चाहते हैं तो केवल ब्रूट फोर्स जाने का रास्ता है - यह तेज़ होगा (जब तक कि संग्रह बड़ा न हो) और यह कोड का एक स्पष्ट टुकड़ा होगा।

20

आप किसी तृतीय पक्ष लाइब्रेरी का उपयोग करने के लिए एक विकल्प नहीं है, तो मैं निम्नलिखित कोड इतना बदसूरत (हालांकि कुछ पटकथा भाषाओं यह कर के सुरुचिपूर्ण तरीके की क्या ज़रूरत है) पर विचार नहीं करते:

//map must be a bijection in order for this to work properly 
public static <K,V> HashMap<V,K> reverse(Map<K,V> map) { 
    HashMap<V,K> rev = new HashMap<V, K>(); 
    for(Map.Entry<K,V> entry : map.entrySet()) 
     rev.put(entry.getValue(), entry.getKey()); 
    return rev; 
} 
+0

धन्यवाद, यह मुझे अपने कोड के बारे में याद दिलाता है :) – kostja

14
Map<String, Integer> map = new HashMap<>(); 
Map<Integer, String> swapped = map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); 
+0

भयानक समाधान। – chandresh

0

एक संकेत के रूप में https://stackoverflow.com/a/42091477/8594421

यह केवल काम करता है जवाब देने के लिए, अगर नक्शा एक HashMap नहीं है और डुप्लिकेट मानों शामिल नहीं है।

Map<String,String> newMap = oldMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); 

एक अपवाद

java.lang.IllegalStateException फेंकता है: डुप्लिकेट कुंजी

अगर वहाँ मूल्यों एक बार से अधिक कर रहे हैं।

समाधान:

HashMap<String,String> newMap = new HashMap<>(); 

for(Map.Entry<String,String> entry : oldMap.entrySet()) 
     newMap.put(entry.getValue(), entry.getKey()); 

// Add inverse to old one 
oldMap.putAll(newMap); 
संबंधित मुद्दे