2016-03-16 9 views
6

Tôi cần chuyển đổi số Map thành Map<string,string> và tôi nghĩ rằng trước tiên tôi phải chuyển đổi bản đồ thô thành Map<Object,Object> rồi chuyển đổi lại thành Map<String,String>.Đúc Bản đồ thô thành Bản đồ <Object, Object>, sẽ có vấn đề gì không?

đoạn mã giống như dưới đây.

Map obj1 = new HashMap(); 
    obj1.put("key1", 1); 
    obj1.put("key2", false); 
    obj1.put("key3", 3.94f); 


    Map<Object, Object> obj2 = obj1; 

    Map<String, String> obj = new HashMap<String,String>(); 

    for (Map.Entry<Object, Object> entry: obj2.entrySet()) { 
     obj.put(entry.getKey().toString(), entry.getValue().toString()); 
    } 

Tôi đoán nó sẽ làm việc trong mọi điều kiện nhưng tôi muốn nghe từ người khác về khả năng nguy hiểm của mã này. (Bất kỳ possiblities cho ClassCastException chẳng hạn?)

Hãy cũng cho tôi biết nếu bạn có một ý tưởng tốt hơn.

- Mã sửa đổi

Map obj1 = new HashMap(); 
    obj1.put(2, 1); 
    obj1.put(true, false); 
    obj1.put(4.4f, 3.94f); 

    Map<String, String> obj = new HashMap<String,String>(); 
    for (Object k : obj1.keySet()){ 
     obj.put(k.toString(), obj1.get(k).toString()); 
    } 

Kể từ mục Map liệu sẽ chứa chìa khóa/giá trị của đối tượng dù sao, tôi nghĩ mình không cần phải tạm thời Map<Object,Object>. Chỉ cần lặp qua từng mục hoạt động tốt và tôi không thấy bất kỳ vấn đề nào cho đến nay.

+0

Bạn đang chuyển các loại 'Chuỗi' rõ ràng cho cả khóa và giá trị. Tôi không thấy một vấn đề với điều này. –

+1

Bạn không cần 'obj2'. Bạn có thể viết 'for (Map.Entry entry: obj1.entrySet())'. Nhưng cách tốt nhất là sử dụng các ký tự đại diện - những gì bạn có là 'Bản đồ '. –

Trả lời

1

Nếu bạn nhìn ra định nghĩa HashMap trong jdk 1.4 Nó trước đó Thực hiện bằng cách sử dụng Object Lớp khi không có khái niệm generics.

Khi generics được giới thiệu object này được thay thế bằng <T>. Nhưng nếu bạn vẫn không sử dụng Generics Gõ an toàn thì nội bộ tuyên bố này new HashMap() phản ánh một phiên bản của <Object, Object>. Tốt hơn Để sử dụng trực tiếp một new HashMap() là ý tưởng tốt hơn. Không cần phải có Map <Object, Object> obj2.

Vì vậy, GO Đối với điều này .. một cách tiếp cận tốt hơn.

Map obj1 = new HashMap(); 
    obj1.put("key1", 1); 
    obj1.put("key2", false); 
    obj1.put("key3", 3.94f); 


Map<Object, Object> obj2 = obj1; 

Map<String, String> obj = new HashMap<String,String>(); 

for (Object obj_Entry : obj1.entrySet()) { 
    Map.Entry entry = (Map.Entry) obj_Entry; // This will Work Fine all Time. 
    obj.put(entry.getKey().toString(), entry.getValue().toString()); 

} 
0

Mã của bạn sẽ không tạo ra ClassCastExceptions. Trên thực tế bạn không làm bất kỳ đúc ở đây. Bạn chỉ cần gọi phương thức toString() của mỗi cặp khóa/giá trị để làm cho nó thành một chuỗi. Miễn là toString() trả về giá trị hợp lệ của các đối tượng của bạn. Mã của bạn sẽ ổn thôi.

Nhưng code của bạn có thể sản xuất NullPointerExceptions nếu obj1 của bạn có chứa các phím null hoặc đối tượng

obj1.put(null, "null value") 

Cũng lưu ý rằng một số va chạm quan trọng có thể xảy ra nếu toString() phương pháp quay trở lại cùng một giá trị String cho hai phím. Điều này là không thể nhưng nó là có thể.

Các vấn đề liên quan