2012-12-06 8 views
14

Bu soruyu araştırdım ve Map.Entry'yi here gibi kullanan yanıtları buldum, ancak getValue() yöntemi, haritadaki nesnenin türü yerine bir Object nesnesi döndürdü. Aşağıdaki örnekte olduğu gibi, bir Kullanıcı nesnesini döndürmek için ona ihtiyacım var, böylece o sınıftan bir yöntem kullanabilirim. Ancak while döngüsünü kullanmayı denediğimde, döngüden asla ayrılmaz. Bunu yapmak için doğru yolu merak ediyordum.Java Bağlantılı Hash haritasından nasıl yinelerim?

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' yolu anahtarları ve değerleri hem ihtiyaç doğru yoldur. Eğer getValue() 'nin derleme zamanı döndürme türü bir 'Object' ise, o zaman 'Map.Entry' beyanında tip parametrelerinin eksik olması muhtemeldir. –

+0

Hata ayıklamaya ve nereye takıldığını görmeye çalıştınız mı? – loveToCode

+0

@MattBall Alright Tekrar deneyeceğim. – user1875021

cevap

17

ve Jenerik özelliklere atlayarak ediyoruz. Bunun için

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

Ah görüyorum. Bunu denedim, ama Generics hakkında bilgi sahibi olmadım, bu yüzden bir Object almaya devam ettim. Teşekkürler – user1875021

2

Eğer .iterator() diyoruz her zaman, bu size ilk ayağında yepyeni yineleyici verir.

Bir kez .iterator() numaralı telefonu arayarak yerel bir değişkende saklamanız gerekir.

+0

Yani 'Iterator temp = users.values.iterator(); '? – user1875021

19

Bunu yapmanın doğru yolunu merak ediyordum.

Map.Entry türünü kullanmalısınız; Sadece jenerik ile kullanmak tip parametrelerini sağlamanız gerekir: Sen yineleyici kötü kullanıyoruz

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

O zaman 'entry.getValue() yapabilseydim someUserMethod();' – user1875021

+1

@ user1875021 Daha önce de söylediğim gibi, 'entry.getValue()', 'User' türündeyse, bunun cevabı açık ol. Her zaman deneyebilirsin. – EJP

+0

@ user1875021 Kesinlikle! 'entry.getValue()' 'User' türündeyse, onunla istediğiniz her şeyi yapabilirsiniz. – dasblinkenlight

0

değişikliğin kodu: Bunu süreç olmuştur sonra koleksiyonundan "sonraki" kaldırmak zorunda

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

    while (it.hasNext()) 
    { 

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

. kodunuzda "stokta" yazılmıştır; Örneğin : En "users.values ​​()"

yani bir koleksiyon dönerse {{john, 1}, {jen, 2}, {peter, 3}}

döngüler return true tutar Sizin iken ve yumruk dizininde olan "{john, 1}" geri dönmeye devam ettiği için. ve bu yüzden sonsuz bir "döngü" dir. Yineleyici bu şekilde çalışır. hasNext() öğesi, ilk dizinde bir öğeye sahipse true değerini döndürür ve sonraki(), hasNext() öğesinin sahip olduğu onaylayan öğeyi döndürür. Bu yardımcı olur

 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); 
    } 

umut ..

Benim eski kodu "doğru olmayabilir: En döngü iyi geçmesi için

i kod satırını eklemek zorunda veya 2. aşağıya bakınız düşünüyorum "Bunu yapmak için yol ama iş yaptı ve herhangi bir ikinci eleman @ EJP SKIP değil. bana düz koyduğun için teşekkürler .. :)

+0

Hiçbir şeyi kaldırmak zorunda değilsiniz. Sadece doğru bir şekilde yinelemen gerekiyor. Bu kod her ikinci elemanı kaldıracak ve atlayacak. -1 – EJP

2

Yinelemenin en kolay yolu şudur. Bir LinkedHashMap olarak böyle olacaktır:

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

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

Source

İlgili konular