2012-12-06 10 views
14

मैंने इस प्रश्न की खोज की और उन उत्तरों को पाया जो Map.Entry here जैसे थे, हालांकि getValue() विधि ने मानचित्र में ऑब्जेक्ट के प्रकार के बजाय ऑब्जेक्ट ऑब्जेक्ट लौटाया। नीचे दिए गए उदाहरण की तरह, मुझे उपयोगकर्ता ऑब्जेक्ट को वापस करने की आवश्यकता है ताकि मैं उस वर्ग से एक विधि का उपयोग कर सकूं। जब मैंने नीचे दी गई लूप का उपयोग करने की कोशिश की, तो यह कभी लूप नहीं छोड़ता है। मैं ऐसा करने का सही तरीका सोच रहा था।मैं जावा लिंक्ड हैश मानचित्र के माध्यम से कैसे पुन: प्रयास करूं?

Map<String, User> users = new LinkedHashMap<String, User>(); 
users.put(name, user); 

while(users.values().iterator().hasNext()){ 

    currentUser = users.values().iterator().next(); 
    currentUser.someMethod(); 
} 
+0

'Map.Entry' तरह से सही तरीका है जब आप दोनों कुंजी और मूल्यों की जरूरत है। यदि 'getValue()' का संकलन-समय रिटर्न प्रकार एक 'ऑब्जेक्ट' है तो संभवतः आप 'Map.Entry' घोषणा' पर टाइप पैरामीटर खो रहे हैं। –

+0

क्या आपने इसे डीबग करने का प्रयास किया और देखा कि यह कहां फंस गया है? – loveToCode

+0

@ मैटबॉल ठीक है मैं फिर कोशिश करूंगा। – user1875021

उत्तर

17

आप इटरेटर का दुरुपयोग कर रहे हैं, और आप जेनेरिक्स विनिर्देशों को छोड़ते हुए कर रहे हैं।

Iterator<User> it = users.values().iterator(); 
while (it.hasNext()) 
{ 
    User currentUser = it.next(); 
    currentUser.someMethod(); 
} 
+0

आह मैं देखता हूँ। मैंने कोशिश की, लेकिन जेनेरिक के बारे में परिचित नहीं था इसलिए मैंने ऑब्जेक्ट प्राप्त किया। धन्यवाद – user1875021

2

हर बार जब आप .iterator() कहते हैं, यह आप पहले तत्व पर एक नया iterator देता है।

आपको एक बार .iterator() पर कॉल करने और स्थानीय चर में स्टोर करने की आवश्यकता है।

+0

देता है तो 'Iterator temp = users.values.iterator(); '? – user1875021

19

मैं ऐसा करने का सही तरीका सोच रहा था।

आपको Map.Entry प्रकार का उपयोग करना चाहिए; तुम सिर्फ जेनरिक के साथ उपयोग करने के लिए प्रकार पैरामीटर प्रदान करने की आवश्यकता:

for (Map.Entry<String,User> entry : users.entrySet()) { 
    // entry.getValue() is of type User now 
} 
+0

तो क्या मैं 'entry.getValue(); कुछ यूज़र मोड();' – user1875021

+1

@ user1875021 जैसा कि उसने पहले से ही आपको बताया है कि 'entry.getValue() 'प्रकार' उपयोगकर्ता 'प्रकार का है, इसका उत्तर स्पष्ट हो। आप हमेशा कोशिश कर सकते हैं। – EJP

+0

@ उपयोगकर्ता 1875021 बिल्कुल! 'entry.getValue()' प्रकार 'उपयोगकर्ता' प्रकार का है, आप जो भी चाहें वह कर सकते हैं। – dasblinkenlight

0

परिवर्तन इस बात के लिए अपने कोड:

Iterator<User> it = users.values().iterator(); 

    while (it.hasNext()) 
    { 

     currentUser = it.next(); 
     currentUser.someMethod(); 
    } 
-2

आप को दूर करने के संग्रह से "अगला" यह प्रक्रिया रही है के बाद की है। अपने कोड के साथ, यह "अगला" पर स्टॉक है; उदाहरण के लिए: अपने "users.values ​​()" यानी

एक संग्रह लौटाता है यदि {{जॉन, 1} {जेन, 2} {पीटर, 3}}

आपका छोरों सच लौट रहता है, जबकि और क्योंकि यह "{जॉन, 1}" लौटता रहता है जो मुट्ठी सूचकांक पर है। और इसलिए यह एक अनंत "पाश" है। इस तरह Iterator काम करता है। हैनक्स्ट() पहले वापस आ जाएगा यदि उसके पहले इंडेक्स में कोई तत्व है और अगला() उस तत्व को वापस कर देगा जिसमें नेक्स्ट() ने पुष्टि की है।

अपने पाश प्रगति के लिए के लिए मुझे लगता है कि आप कोड की एक पंक्ति जोड़ने के लिए या 2. नीचे देखें:

 Map<String, String> users = new HashMap<String, String>(); 
    users.put("1", "John"); 
    users.put("2", "peter"); 
    users.put("3", "uche"); 
    Iterator<String> coll = users.values().iterator(); 
     while(coll.hasNext()){ 


     String currentUser = coll.next(); 
     System.out.print(currentUser); 

     //coll.remove(currentUser); 
    } 

आशा .. इस में मदद करता है

मेरे पूर्व कोड "सही नहीं हो सकता है "ऐसा करने का तरीका है लेकिन नौकरी की है और किसी भी दूसरे तत्व @ ईजेपी को स्किप नहीं किया है। मुझे सीधे डालने के लिए किसी भी तरह से धन्यवाद .. :)

+0

आपको कुछ भी हटाने की ज़रूरत नहीं है। आपको बस सही ढंग से फिर से शुरू करना होगा। यह कोड हर दूसरे तत्व को हटा देगा और छोड़ देगा। -1 – EJP

2

इसके लिए सबसे आसान तरीका उपयोग कर रहा है। एक LinkedHashMap में यह इस तरह होगा:

private static LinkedHashMap<Integer, String> dataBase = new LinkedHashMap<Integer, String>(); 

    for(Integer key : dataBase.keySet()) { 
     String ret = dataBase.get(key); 
    } 

Source