2010-11-11 14 views
6

पर प्रारंभ करें सबसे अच्छा तरीका क्या है?हैश मैप <स्ट्रिंग, बूलियन> सभी कुंजी को हैश मैप <स्ट्रिंग, इंटीजर> में कॉपी करें और शून्य को

बस कुंजी और शून्य के माध्यम से लूपिंग और डालने, या वहां एक और अधिक सुरुचिपूर्ण या मौजूदा लाइब्रेरी विधि है। मैं Google की अमरूद जावा लाइब्रेरी का भी उपयोग कर रहा हूं यदि इसमें कोई उपयोगी कार्यक्षमता है?

यह जांचना चाहता था कि सूचियों के लिए कॉपी विधि के समान कुछ है या मानचित्र की putAll विधि, लेकिन केवल कुंजी के लिए।

+0

कृपया, अपने प्रश्न को दोबारा दोहराएं, मैं इसे समझ नहीं पाया। – Isac

+0

मैं सिर्फ चाबियों के माध्यम से लूप होगा, यह केवल कोड की तीन पंक्तियां लेगा। यदि आप इसे कम करना चाहते हैं तो आप इसे करने के लिए एक विधि लिख सकते हैं। –

+2

ध्यान दें कि यदि आप किसी मानचित्र के बजाय मल्टीसेट का उपयोग करते हैं तो आपको सभी कुंजी को शून्य पर प्रारंभ करने की आवश्यकता नहीं है। पहली बार जब आप किसी नई कुंजी की घटनाओं को जोड़ते हैं तो यह आपके लिए इसे प्रारंभ करेगा। –

उत्तर

18

वहाँ फैंसी कुछ भी यहाँ के लिए ज्यादा जरूरत नहीं लगता:

Map<String, Integer> newMap = Maps.newHashMap(
    Maps.transformValues(map, Functions.constant(0))); 

// 1-liner with static imports! 
Map<String, Integer> newMap = newHashMap(transformValues(map, constant(0))); 
1
final Integer ZERO = 0; 

for(String s : input.keySet()){ 
    output.put(s, ZERO); 
} 
+3

स्थिर नाम ज़ीरो क्यों बनाते हैं? यदि यह मान में अर्थ नहीं जोड़ता है, तो 0 का उपयोग क्यों न करें? – Isac

+0

@Isac: सुनिश्चित नहीं है लेकिन इंटीजर.valueOf (0) प्रत्येक लूप के लिए मूल्यांकन नहीं किया जाएगा? – pgras

+1

@ आईएसएसी: बहुत यकीन है कि प्रत्येक पुनरावृत्ति मुक्केबाजी से बचने के लिए होगा, जो प्रदर्शन के मामले में थोड़ा बेहतर हो सकता है। मुझे ऐसा नहीं लगता कि यह कम स्पष्टता के लायक है। – ColinD

2

पाशन सुंदर है:

Map<String, Boolean> map = ...; 
Map<String, Integer> newMap = Maps.newHashMapWithExpectedSize(map.size()); 
for (String key : map.keySet()) { 
    newMap.put(key, 0); 
} 

आप कुछ अमरूद के साथ फैंसी चाहते हैं, तो इस विकल्प है आसान (और सुरुचिपूर्ण नहीं)। मूल Map की चाबियों पर Iterate और इसे शून्य के मान के साथ नई प्रति में डाल दें।

Set<String> keys = original.keySet(); 
Map<String, Integer> copy = new HashMap<String, Integer>(); 
for(String key : keys) { 
    copy.put(key, 0); 
} 

आशा है कि मदद करता है।

+5

'नया इंटीजर (0)' का उपयोग ढेर का बहुत अपमानजनक है। 0 का उपयोग करने और ऑटोबॉक्सिंग कार्य देने पर विचार करें, या यदि आप ऑटोबॉक्सिंग से घृणा करते हैं, तो 'Integer.valueOf (0)' का उपयोग करें। –

+0

मैं बस एक साधारण जवाब देने की कोशिश कर रहा था। और autoboxing नए इंटीजर (0) के समान है, है ना? हां, Integer.valueOf (0) कम स्मृति का उपयोग करेगा। – Todd

+4

नहीं, यह 'Integer.valueOf (0)' (जो -128 और 127 के बीच संख्याओं के लिए कैश किए गए बॉक्स किए गए मानों का उपयोग करता है) करता है। –

संबंधित मुद्दे