2011-12-12 23 views
6

Ben java'ya yeni geliyorum, lütfen bana devam edin. Dize anahtarları ve aşağıdaki gibi Boole değerleri içeren bir hashtagim var. Bir işlevden döndürdüğüm budur. Bunu başka bir yere götürdüğümde, doğru ya da yanlış olup olmadığını görmek için bunlardan birinin bir if ifadesini çağırmak istiyorum.Harita içindeki boolean değerini nasıl test edebilirsiniz?

if(states.get("b_StorageAvailable")) { 
    //Do this 
} 

Ama java Bunun Boole tip olması gerektiğini bana gösterilen tutar ve bir Harita türüdür. Bunu nasıl kolayca yapabilirim?

GÜNCELLEME

kod ben şöyle

Map states = this.getExternalStorageStatus(); 
+2

Bir Set kullanmayı düşündünüz mü? – mschonaker

+2

Jdk 1.6 –

+0

kullanarak tutulma benim için iyi çalışıyor '' 'bir yorum içerideyken, derleyici/IDE kodunuzda hiçbir sorun yok –

cevap

5

Kodunuz güzel görünüyor. Sadece aynı anahtarı kullandığınızdan emin ol ("b_StorageAvailable"). Map'daki Boolean, ilkel bir boolean'a otomatik olarak eklendiğinden, sağlanan anahtar için Map'da giriş yoksa, bir NullPointerException alırsınız.

Ayrıca, işlevinizin dönüş türünün ve yerel değişkenin HashMap<String, Boolean> olarak tanımlandığını da kontrol ediyorum. Eğer yazılmamışsa, o zaman Map'da Boolean olduğunu kabul edemezsiniz.

public static void main(String[] args) { 

    Map<String, Boolean> states = new HashMap<String, Boolean>(); 
    states.put("b_StorageAvailable", true); 
    states.put("b_StorageWritable", true); 

    if(states.get("b_StorageAvailable")){ // works fine! 
     System.out.println("storage is available!"); 
    } 

    Map states2 = new HashMap<String, Boolean>(); // untyped! 
    states.put("b_StorageAvailable", true); 
    states.put("b_StorageWritable", true); 
    if(states2.get("b_StorageAvailable")){ // Type mismatch: cannot convert from Object to boolean 
     System.out.println("storage is available!"); 
    } 

} 

Yani tüm yapmanız gereken

Map states = this.getExternalStorageStatus(); 

Map<String, Boolean> states = this.getExternalStorageStatus(); 

Ve getExternalStorageStatus()

private Map<String,Boolean> getExternalStorageStatus(){ 
... 
} 
+0

Dönüş türü Map'dir. HashMap olmalı? Orada, eyaletlerimin bir Harita tipi olduğunu görebiliyorsunuz. – Metropolis

+0

Dönüş türünü HashMap olarak değiştirme ve durumların HashMap'e yazılması hatayı düzeltmez. – Metropolis

+0

NullPointerException ile sonuçlanabilecek bir değer elde etme olasılığının hala olduğunu unutmayın. Bunun kontrol edilmesi gerekiyor. Lütfen bunu uygun bir şekilde halledebilmek için bir linerin cevabına bakın. – ziesemer

5

Eğer Java 5 veya daha yeni (konum varsayarsak ile işlevini çağırarak ve dönüş değerini alıyorum unutulmamalıdır Eğer olması gereken, eşdeğer ilaç gösterdi kullanımı) verilen:

if(Boolean.TRUE.equals(states.get("b_StorageAvailable"))){ 
    //Do this 
} 
+0

Bunu koymayı denedim ama netbeans bunu bir hata olarak gösteriyor. Ancak henüz çalıştırmayı denemedim: p – Metropolis

+0

Çalışmıyorsa, lütfen gösterdiği hatanın açıklamasını ekleyin. – ziesemer

+0

Hatanız yanlış eşleştirilmiş parantez nedeniyle olabilir - "if yapın" (if) "(" b_StorageAvailable ") == true) {/ * Bunu yapın * /}' – Caspar

1

bu

yaptığınızda
if(states.get("b_StorageAvailable")) 
Bunu böyle değişen anahtar b_StorageAvailable

karşı depolanan değeri almaya tyring

:

if(states.get("b_StorageAvailable")) != null { 
    //Do your task check if the boolean is false or not 
} 

Gidiyor veya en basit

if(states.get("b_StorageAvailable") != null && states.get("b_StorageAvailable").booleanValue()) { 
    //Do your task 
} 

geçecektir Haritanızın belirli bir anahtar içerip içermediğini kontrol etmek istediğinizde, eğer map.containsKey API

+0

Uyarı: 'if (status.get (" b_StorageAvailable "))! = Null)' 'Map' içindeki değer 'false' olsa bile' true' olarak değerlendirecektir. – Asaph

+1

@Asaph: Onun noktası geçerli bir önlemdir. Eşleme, sağlanan anahtar için uygun değilse ne olur? Sonunda, '.booleanValue()' kullanarak boolean değerinin (otomatik) çıkarılması sırasında bir "NullPointerException" a yol açacaktır. –

+0

kod snippet'ini düzeltildi ... teşekkürler :) – mprabhat

0

Sizin sözdizimi dönüş tipi gayet potentialy değişikliğe değiştirmek olduğunu Test c yazdım aşağıda ode ve geçti. Ayrıca, anahtar değerlerini doğru şekilde yazdığınızdan emin olmak ve anahtarın storageKey kullanarak geçerli olduğundan emin olmak için sınamak isteyebilirsiniz. Aşağıdaki sınama kodunu yazdım ve geçti.

(mümkünse de aşağıda olduğu gibi uygun bir Class içine Devletleri Harita planı ayrı isteyebilirsiniz ek bir öneri olarak. Etrafa Maps geçen kaçınırız.)

import static org.junit.Assert.assertTrue; 

import java.util.HashMap; 
import java.util.Map; 

import org.junit.Test; 

public class StatesTest { 

    @Test 
    public void testStates() { 
     Map<String, Boolean> statesMap = new HashMap<String, Boolean>(); 
     statesMap.put("b_StorageAvailable", true); 
     statesMap.put("b_StorageWriteable", false); 

     States states = new States(statesMap); 

     assertTrue(states.isStorageAvailable()); 
     assertTrue(states.isStorageWriteable() == false); 
    } 
} 

class States { 
    private boolean storageAvailable; 
    private boolean storageWriteable; 
    // etc 

    public States(Map<String, Boolean> states) {   
     if (states.containsKey("b_StorageAvailable")) { 
      storageAvailable = states.get("b_StorageAvailable"); 
     } 

     if (states.containsKey("b_StorageWriteable")) { 
      storageWriteable = states.get("b_StorageWriteable"); 
     } 
    } 

    public boolean isStorageAvailable() { 
     return storageAvailable; 
    } 

    public boolean isStorageWriteable() { 
     return storageWriteable; 
    } 
} 
İlgili konular