2010-01-12 14 views
18

जहां तक ​​मैं इसे समझता हूं, ऐसा लगता है कि Enumeration सीधे HashMap की कुंजी के लिए प्राप्त करने का कोई सीधा तरीका नहीं है। मुझे केवल keySet() मिल सकता है। उस Set से, मुझे Iterator मिल सकता है लेकिन IteratorEnumeration से कुछ अलग दिखता है।जावा में एक मानचित्र (हैश मैप) के एक गणना (कुंजी के लिए) प्राप्त करें?

HashMap की कुंजी से सीधे Enumeration प्राप्त करने का सबसे अच्छा और सबसे प्रभावी तरीका क्या है?

पृष्ठभूमि: मैं अपना खुद का ResourceBundle (=>getKeys() विधि) लागू कर रहा हूं, और मुझे एक विधि प्रदान करना/कार्यान्वित करना है जो सभी कुंजीों का गणित देता है। लेकिन मेरा कार्यान्वयन HashMap पर आधारित है, इसलिए मुझे किसी भी तरह से यह पता लगाना होगा कि इन दो "इटरेटर/एन्युमेटर" तकनीकों को betweens को सर्वोत्तम रूप से कैसे परिवर्तित किया जाए।

+3

उपयोग कर सकते हैं तो ऐसा कोई कारण तुम क्यों Iterators के बजाय Enumerations की जरूरत है? गणना का जावाडोक अनुशंसा करता है कि आप इसके बजाय इटरेटर का उपयोग करें। – lins314159

+1

ठीक है, जिस कक्षा में मैं कार्यान्वित कर रहा हूं उसे गणना की आवश्यकता है: http://java.sun.com/javase/6/docs/api/java/util/ResourceBundle.html#getKeys() (getKey() विधि देखें) एकमात्र चीज जो मैं कर सकता था वह इसे पूरी तरह से अलग करना है और हैश मैप का उपयोग नहीं करना है। फिर भी मुझे एक मानचित्र की कुंजी के लिए गणना प्राप्त करने का सबसे अच्छा और सबसे प्रदर्शन करने वाला तरीका सीखने में बहुत दिलचस्पी होगी। धन्यवाद! – tim

उत्तर

20

Apache commons-collections में एक एडाप्टर है जो Iterator को Enumeration जैसे उपयोग के लिए उपलब्ध बनाता है। IteratorEnumeration पर एक नज़र डालें। , अगर आप (किसी कारण से) डॉन '

Enumeration enumeration = new IteratorEnumeration(hashMap.keySet().iterator()); 

वैकल्पिक रूप से: एक इटरेटर उदाहरण बनाने के लिए

एडाप्टर

संक्षेप में

तो आप निम्नलिखित है एक गणन उदाहरणों प्रतीत टी कॉमन्स-संग्रह शामिल करना चाहते हैं, आप इस एडाप्टर को स्वयं लागू कर सकते हैं। यह आसान है - बस Enumeration का कार्यान्वयन करें, Iterator को किसी कन्स्ट्रक्टर में पास करें, और जब भी hasMoreElements() और nextElement() कहा जाता है, तो आप अंतर्निहित Iterator पर hasNext() और next() पर कॉल करते हैं।

यदि आप कुछ एपीआई अनुबंध द्वारा Enumeration का उपयोग करने के लिए मजबूर हैं (जैसा कि मुझे लगता है कि मामला है) का उपयोग करें। अन्यथा Iterator का उपयोग करें - यह अनुशंसित विकल्प है।

+2

Google संग्रह भी 'Iterators.asEnumerator() 'का उपयोग करके इसका समर्थन करता है: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterators.html#asEnumeration(java.util इटरेटर) –

+0

हैलो बोझो। धन्यवाद, विशेष रूप से दिलचस्प आपकी टिप्पणी थी कि इसे अपने आप कैसे कार्यान्वित करें। मुझे अब तक एहसास नहीं हुआ कि मैं इसे अपने आप कर सकता हूं। पाठ के लिए – tim

+0

+1। –

34

मुझे लगता है कि आप को प्राप्त करने के आप क्या चाहते हैं java.util.Collections वर्ग से विधि गणन उपयोग कर सकते हैं।

विधि की गणना की एपीआई दस्तावेज़ इस में क्या कहना है:

सार्वजनिक स्थिर गणन गणना (संग्रह ग)
निर्दिष्ट संग्रह पर एक गणना देता है। यह विरासत एपीआई के साथ अंतःक्रियाशीलता प्रदान करता है जिसके लिए इनपुट के रूप में गणना की आवश्यकता होती है।

उदाहरण के लिए, नीचे दिए कोड स्निपेट HashMap

final Map <String,Integer> test = new HashMap<String,Integer>(); 
test.put("one",1); 
test.put("two",2); 
test.put("three",3); 
final Enumeration<String> strEnum = Collections.enumeration(test.keySet()); 
while(strEnum.hasMoreElements()) { 
    System.out.println(strEnum.nextElement()); 
} 

की कीसेट से गणन का एक उदाहरण हो जाता है और उत्पादन जिसके परिणामस्वरूप है:
एक
दो
तीन

+0

+1 जब तक आप संग्रह के साथ शुरू करते हैं, तब तक जाने का यह तरीका है। एक कुंजी सेट की गणना करने के लिए अपने स्वयं के एडाप्टर लिखने की जरूरत नहीं है। –

0

आप गणना के अनुकूलन के लिए एक एडाप्टर लिख सकते हैं।

public class MyEnumeration implements Enumeration { 

     private Iterator iterator; 

     public MyEnumeration(Iterator iterator){ 
      this.iterator = iterator; 
     } 


     public MyEnumeration(Map map) { 
      iterator = map.keySet().iterator(); 
     } 


     @Override 
     public boolean hasMoreElements() { 
      return iterator.hasNext(); 
     } 


     @Override 
     public Object nextElement() { 
      return iterator.next(); 
     } 

    } 

और फिर आप इस कस्टम गणन :)

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