2011-12-12 175 views
6

我是新来的java,所以请容易对我。我有一个包含String键和像下面这样的布尔值的散列表。如何测试Map中的布尔值?

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

对此我从函数返回。一旦我在其他地方得到这个,我希望能够在其中的一个上调用if语句来查看它的真假。

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

但java一直告诉我,我需要这是一个布尔类型,它是一个Map类型。我怎样才能轻松做到这一点?

UPDATE

应当注意的是,代码我打电话与函数获得的返回值是这样的,

Map states = this.getExternalStorageStatus(); 
+2

你有没有考虑使用一组? – mschonaker

+2

它工作正常,我使用JDK 1.6 –

+0

日食除了事实,你'}'是一个评论,我的编译器/ IDE与你的代码没有问题,里面 –

回答

5

你的代码看起来不错。只要确保你使用的是完全相同的密钥("b_StorageAvailable")。因为Map中的Boolean被自动装箱为原始布尔值,所以如果Map中没有输入密钥,则会得到NullPointerException

我也会检查你的函数的返回类型和局部变量是否定义为HashMap<String, Boolean>。如果它是无类型的,那么您将无法假定Map中的Boolean

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

} 

因此,所有你需要做的是改变

Map states = this.getExternalStorageStatus(); 

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

而且potentialy变化getExternalStorageStatus()

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

返回类型是地图。它应该是HashMap吗?你可以在那里看到,我的状态是一个Map类型。 – Metropolis

+0

将返回类型更改为HashMap,并将状态类型更改为HashMap不会修复错误。 – Metropolis

+0

请注意,仍有可能无法获取值,这可能会导致NullPointerException。这需要检查。请参考我的答案,以便适当处理这一问题。 – ziesemer

5

假设你在Java 5或更高版本(你必须是,考虑到证明使用泛型):

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

我尝试了,但netbeans显示它是一个错误。但是,我没有尝试并运行它:p – Metropolis

+0

如果它不起作用,请包括它显示的错误说明。 – ziesemer

+0

你的错误可能是由于括号不匹配 - 尝试做'如果(states.get(“b_StorageAvailable”)==真){/ *执行此* /}' – Caspar

1

当你做到这一点

if(states.get("b_StorageAvailable")) 

您tyring去取改变它喜欢这个存储对关键b_StorageAvailable

值:

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

将让你去,或者在最简单的

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

如果你想检查你的地图是否包含特定的密钥,你可以检查,如果map.containsKey API

+0

警告:如果'(states.get( “b_StorageAvailable”))= NULL)'将评估为TRUE;即使在'Map'值是'FALSE'。 – Asaph

+1

@Asaph:他的观点是有效的预防措施。如果映射不可用于提供的密钥,该怎么办?当(自动)使用'.booleanValue()'解开布尔值时,它最终会导致'NullPointerException'。 –

+0

得到的代码片段修正...谢谢:) – mprabhat

0

你的语法返回类型是罚款,我写了测试c颂歌下面,它通过了。您可能还希望确保正确拼写关键值,并使用containsKey确保密钥有效。我写了下面的测试代码,并通过了。

(正如你可能还需要重构你的国家地图到适当类为我做了以下额外的建议。我避免将围绕地图只要有可能。)

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