2011-12-12 37 views
6

Tôi mới sử dụng java, vì vậy hãy dễ dàng thực hiện với tôi. Tôi có một hashmap có chứa các khóa String và các giá trị Boolean như sau.Làm cách nào bạn có thể kiểm tra giá trị boolean bên trong Bản đồ?

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

Tôi đang quay trở lại từ một hàm. Một khi tôi nhận được điều này ở một nơi khác, tôi muốn có thể gọi một tuyên bố nếu một trong những điều này để xem nếu nó đúng hay sai.

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

Nhưng java vẫn cho tôi thấy rằng tôi cần đây là loại Boolean và đó là loại Bản đồ. Làm thế nào tôi có thể làm điều này một cách dễ dàng?

CẬP NHẬT

Cần lưu ý rằng mã Tôi gọi hàm với và nhận giá trị trả về trông như thế này,

Map states = this.getExternalStorageStatus(); 
+2

bạn đã xem xét sử dụng một Set ? – mschonaker

+2

Nó hoạt động tốt cho tôi trên nhật thực bằng cách sử dụng Jdk 1.6 –

+0

Ngoài thực tế là '}' của bạn nằm trong một chú thích, trình biên dịch/IDE của tôi không có vấn đề với mã của bạn –

Trả lời

5

Mã của bạn có vẻ ổn. Chỉ cần chắc chắn rằng bạn đang sử dụng chính xác cùng một khóa ("b_StorageAvailable"). Vì Boolean trong số Map được tự động đóng hộp thành boolean nguyên thủy, nếu không có mục nhập nào trong số Map cho khóa được cung cấp, bạn sẽ nhận được NullPointerException.

Tôi cũng sẽ kiểm tra xem loại trả về của hàm của bạn và biến cục bộ cũng được xác định là HashMap<String, Boolean>. Nếu nó không được nhập sai, bạn sẽ không thể giả định đó là Boolean trong số 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!"); 
    } 

} 

Vì vậy, tất cả các bạn cần làm là thay đổi

Map states = this.getExternalStorageStatus(); 

để

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

Và sự thay đổi ẩn chưa tiêm năng kiểu trả về của getExternalStorageStatus()

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

Loại trả về là Bản đồ. Nó có nên là HashMap không? Bạn có thể thấy trên đó, trạng thái của tôi là một loại Bản đồ. – Metropolis

+0

Thay đổi kiểu trả về thành HashMap và loại trạng thái thành HashMap không sửa lỗi. – Metropolis

+0

Lưu ý rằng vẫn có khả năng không lấy lại một giá trị, điều này có thể dẫn đến NullPointerException. Điều này cần phải được kiểm tra. Xin vui lòng tham khảo câu trả lời của tôi cho một lớp lót để xử lý một cách thích hợp. – ziesemer

5

Giả sử bạn đang ở trên Java 5 hoặc mới hơn (mà bạn phải, do việc sử dụng chứng minh của Generics):

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

Tôi đã thử đặt nó nhưng netbeans cho thấy nó như là một lỗi. Tuy nhiên, tôi chưa thử chạy nó: p – Metropolis

+0

Nếu nó không hoạt động, vui lòng bao gồm mô tả lỗi mà nó đang hiển thị. – ziesemer

+0

Lỗi của bạn có thể là do các dấu ngoặc không khớp - hãy thử làm 'if (states.get (" b_StorageAvailable ") == true) {/ * Thực hiện điều này * /}' – Caspar

1

Khi bạn làm điều này

if(states.get("b_StorageAvailable")) 

Bạn đang tyring để lấy giá trị được lưu trữ chống lại chìa khóa b_StorageAvailable

thay đổi nó như thế này:

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

sẽ giúp bạn có được đi hay đơn giản

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

trong trường hợp bạn muốn kiểm tra xem bản đồ của bạn có chứa một khóa cụ thể hay không, bạn có thể kiểm tra xem nếu map.containsKey API

+0

Cảnh báo: 'if (states.get (" b_StorageAvailable "))! = Null)' sẽ đánh giá 'true' ngay cả khi giá trị trong' Bản đồ' là 'sai'. – Asaph

+1

@Asaph: Quan điểm của ông là một biện pháp phòng ngừa hợp lệ. Điều gì xảy ra nếu ánh xạ không có sẵn cho khóa được cung cấp? Nó cuối cùng sẽ dẫn đến một 'NullPointerException' trong khi (tự động) unboxing giá trị boolean bằng cách sử dụng' .booleanValue() '. –

+0

đã sửa đoạn mã ... cảm ơn :) – mprabhat

0

cú pháp của bạn là tốt, Tôi đã viết bài kiểm tra c ode bên dưới và nó trôi qua. Bạn cũng có thể muốn đảm bảo bạn đánh vần chính xác các giá trị chính và kiểm tra để đảm bảo khóa hợp lệ bằng cách sử dụng containsKey. Tôi đã viết mã kiểm tra sau và nó đã trôi qua.

(Như một gợi ý bổ sung mà bạn cũng có thể muốn Refactor Hoa Bản đồ của bạn thành một lớp đúng như tôi đã làm dưới đây. Tôi tránh đi xung quanh Maps bất cứ khi nào có thể.)

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; 
    } 
} 
Các vấn đề liên quan