2011-12-12 14 views
6

Soy nuevo en Java, así que por favor, no me moleste. Tengo un hashmap que contiene claves de cadena y valores booleanos como el siguiente.¿Cómo se puede probar un valor booleano dentro de un mapa?

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

Lo que vuelvo de una función. Una vez que obtenga esto en otro lugar, me gustaría poder llamar a una declaración if en uno de estos para ver si es verdadera o falsa.

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

Pero java me sigue diciendo que necesito que sea de tipo booleano, y es un tipo de mapa. ¿Cómo puedo hacer esto fácilmente?

ACTUALIZACIÓN

Debe tenerse en cuenta que el código que estoy llamando a la función con y obtener el valor de retorno se parece a esto,

Map states = this.getExternalStorageStatus(); 
+2

¿Ha considerado el uso de un conjunto de ? – mschonaker

+2

Funciona bien para mí en eclipse usando Jdk 1.6 –

+0

Además de que su '}' está dentro de un comentario, mi compilador/IDE no tiene problemas con su código –

Respuesta

5

Su código se ve bien. Solo asegúrese de estar usando exactamente la misma clave ("b_StorageAvailable"). Como el Boolean en el Map está en caja automática a un booleano primitivo, si no hay una entrada en el Map para la clave suministrada, obtendrá un NullPointerException.

También verificaría que el tipo de retorno de la función y la variable local se definan como HashMap<String, Boolean> también. Si no está escrito, entonces no podrá asumir que es Boolean en el Map.

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

} 

Así que todo lo que necesita hacer es cambiar

Map states = this.getExternalStorageStatus(); 

a

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

Y el cambio potentialy el tipo de retorno de getExternalStorageStatus()

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

El tipo de devolución es Mapa. ¿Debería ser HashMap? Puedes ver que mis estados son un tipo de mapa. – Metropolis

+0

Al cambiar el tipo de devolución a HashMap, y el tipo de estados a HashMap no se corrige el error. – Metropolis

+0

Tenga en cuenta que todavía existe el potencial de no recuperar un valor, lo que podría dar como resultado una NullPointerException. Esto necesita ser verificado. Por favor, consulte mi respuesta para un trazador de líneas para manejar adecuadamente esto. – ziesemer

5

Suponiendo que estás en Java 5 o más reciente (el cual debe ser, dado el uso demostrado de genéricos):

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

Intenté poner eso pero netbeans lo muestra como un error. Sin embargo, no lo intenté y lo ejecuté: p – Metropolis

+0

Si no funciona, incluye la descripción del error que se muestra. – ziesemer

+0

Su error podría deberse a llaves incorrectamente emparejadas - intente hacer 'if (states.get (" b_StorageAvailable ") == true) {/ * Hacer esto * /}' – Caspar

1

al hacer esto

if(states.get("b_StorageAvailable")) 

Usted está tyring a buscar el valor almacenado en contra de la llave b_StorageAvailable

cambiándolo a este aspecto:

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

se conseguirá que va o el

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

en Si desea verificar si su mapa contiene una clave específica, puede verificar si map.containsKey API

+0

Advertencia: 'if (states.get (" b_StorageAvailable "))! = Null)' evaluará a 'true' incluso si el valor en' Map' es 'false'. – Asaph

+1

@Asaph: Su punto es una precaución válida. ¿Qué sucede si la asignación no está disponible para la clave provista? Eventualmente conducirá a una 'NullPointerException' mientras (auto) desempaqueta el valor booleano usando' .booleanValue() '. –

+0

obtuvieron el fragmento de código corregido ... gracias :) – mprabhat

0

Su sintaxis está muy bien, Escribí la prueba c ode abajo y pasó. Es posible que también desee asegurarse de que está deletreando correctamente los valores de las claves y probar para asegurarse de que la clave sea válida utilizando containsKey. Escribí el siguiente código de prueba y pasó.

(Como una sugerencia adicional que también puede querer refactorizar el mapa de los estados en una clase adecuada como lo hice a continuación. Evito pasar alrededor de mapas siempre que sea posible.)

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; 
    } 
} 
Cuestiones relacionadas