2013-07-02 27 views
5

Ben iki HashmapsHashMap almak döner boş

HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>(); 
HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>(); 

Ben şimdiki denetler ve bu ekler bir döngü:

for(Item item : items){ 
    int currentRequirement = 0; 
    currentRequirement = inventoryRequirements.get(item.get_id()); 
    inventoryRequirements.put(item.get_id(), currentRequirement++);   
} 

Ben envanter kontrol eder ve bu ekler başka döngü:

for(Item item : items){ 
    int currentInventory = 0; 
    // this next line returns null 
    currentInventory = inventory.get(item.get_id()); 
    inventory.put(item.get_id(), currentInventory++);   
} 

Birincisi iyi çalışır, ancak ikincisi peki ve bir boş döndürür. Neden ikincinin işe yaramadığını anlamıyorum. Her ikisi de başlangıçta kod örneğinde gösterildiği gibi aynı durumda.

DÜZENLEME burada gördüğünüz gibi

iki HM doldurulan - gerçekten! İnanması zor olabileceğini biliyorum, ancak ilk iş ve ikincisi işe yaramıyor.

+7

Hiç bir şeyi "envantere" soktun mu? Ayrıca, neden Harita <Öğe, Tamsayı> 'yi kullanmıyorsunuz? – Jeffrey

+2

"envanterRequirements" boş başlatılırsa, ilk döngü de başarısız olur. – Joni

+0

Hiç bir şey koymak için çizgiye asla ulaşmaz. Bunun yerine neden Harita'ya değil - bunun için iyi bir cevabım yok - gerçek bir avantaj var mı? –

cevap

1

Sağladığınız kod tamamlanmışsa, hashmap ürününüze herhangi bir şey eklemediniz. Yani her zaman null döndürecektir.

+0

True !! Ama bu durumda ilk kod parçasının neden iyi çalıştığını merak ediyorum ??? – PVR

+0

Bu doğru değil. 'Foreach' döngüsünün kendisi, 'HashMap' üzerinden yineleme yapamaz, eğer böyle bir durum söz konusu ise. – Lion

+0

Nasıl olur? Foreach döngü, numaralı listede yineleniyor. Size neden başarısız olacağını anladım .. – PVR

0

Sen inventory bir öğeyi alıyorsanız ama sen get() aracılığıyla talep anahtar Map değilse bir NullPointerException (NPE) atacağım göstermek döngü

10

İkisi boş. Anahtar mevcut olmadığında (veya tabii ki bu anahtarla depolanan değer null ise) , null değerini döndürür (). Bir Integer (otomatik kutu tipi), null olan bir int içine otomatik olarak kaydedilemez, böylece bir NPE atar.

bu performans güvenli yoludur: Elbette

for (Item item : items) { 
    Integer currentRequirement = inventoryRequirements.get(item.get_id()); 
    if (currentRequirement != null) { 
     inventoryRequirements.put(item.get_id(), currentRequirement++);   
    } 
} 

, koleksiyonların da tamamen mümkün Eğer NPE atma ne olduğunu null ve senin koleksiyonunda bir Item olduğunu.

+0

+1, ancak null attığını ve null atmadığını söyler, ancak bu bir “int” olduğu için de mantıklı değildir. –

+0

Eğer 'get()', 'null' döndürürse atar. Ya da onun JVM/bilgisayarı bozuldu;) Ben bir 'item' olan 'null' kendime yaslıyorum. –