2012-12-21 24 views
10

यह सवाल एक तरह से पहले से ही यहाँ पोस्ट किया जाता है प्रदान नहीं करता है: How to convert Map<String, String> to Map<Long, String> using guavaक्यों अमरूद नक्शा कुंजी को बदलने के लिए एक रास्ता

मुझे लगता है कि CollinD का जवाब उचित है:

बदलने के लिए

अमरूद के सभी पद्धतियों का और फ़िल्टरिंग आलसी परिणाम ... फ़ंक्शन/पूर्वानुमान केवल ऑब्जेक्ट के रूप में आवश्यक होने पर लागू होता है। वे प्रतियां नहीं बनाते हैं। इसके कारण, परिवर्तन आसानी से Set की आवश्यकताओं को तोड़ सकता है।

मान लें, उदाहरण के लिए, आपके पास Map<String, String> है जिसमें दोनों "1" और "01" कुंजी के रूप में हैं। वे दोनों अलग String एस हैं, और इसलिए Map कानूनी रूप से दोनों कुंजी के रूप में हो सकते हैं। यदि आप उन्हें Long.valueOf(String) का उपयोग करके बदलते हैं, तो वे दोनों 1 मान पर नक्शा लगाते हैं। वे अब विशिष्ट कुंजी नहीं हैं। यदि आप मानचित्र की एक प्रति बनाते हैं और प्रविष्टियां जोड़ते हैं, तो यह कुछ भी तोड़ने वाला नहीं है, क्योंकि किसी भी डुप्लिकेट कुंजी उस कुंजी के लिए पिछली प्रविष्टि को ओवरराइट कर देगी। एक आलसी Map को परिवर्तित किया गया, हालांकि, अद्वितीय कुंजी लागू करने का कोई तरीका नहीं होगा और इसलिए Map का अनुबंध तोड़ देगा।

यह सच है, लेकिन वास्तव में मुझे समझ नहीं आता क्यों यह वजह से नहीं किया जाता है:

  • जब कुंजी परिवर्तन होता है, यदि 2 कुंजी "विलय कर दिया" कर रहे हैं, एक क्रम अपवाद हो सकता है उठाया, या हम अमरूद को इंगित करने के लिए नव गणना की कुंजी के लिए अनेक संभावित मान (failfast/फेल सेफ संभावनाओं)

  • हम एक Maps.transformKeys जो एक मल्टीमैप

  • का उत्पादन हो सकता है की किसी भी मूल्य लेने के लिए एक झंडा गुजर सकता है

क्या ऐसी कोई कमी है जो मुझे ऐसी चीजों में करने में नहीं दिखती है?

+0

प्रोग्रामर के लिए अधिक उपयुक्त लगता है .stackexchange.com –

उत्तर

8

जैसा कि @ कॉलिन डी सुझाव देता है, आलसी तरीके से ऐसा करने का कोई तरीका नहीं है। get को लागू करने के लिए, आपको अपने परिवर्तन फ़ंक्शन के साथ सभी कुंजियों को परिवर्तित करना होगा (यह सुनिश्चित करने के लिए कि कोई डुप्लीकेट खोजे गए हों)।

तो Function<K,NewK> से Map<K,V> लागू हो रहा है।

आप सुरक्षित रूप से नक्शा करने के लिए Function<NewK,K> लागू हो सकते हैं:

V value = innerMap.get(fn.apply(newK)); 

मुझे लगता है कि के लिए एक अमरूद आशुलिपि नहीं दिख रहा है - यह सिर्फ पर्याप्त उपयोगी नहीं हो सकता। आप के साथ इसी तरह के परिणाम मिल सकते हैं:

Function<NewK,V> newFn = Functions.compose(Functions.forMap(map), fn);