2010-10-18 35 views
22

Tôi đặt một cặp khóa-giá trị trong một Java HashMap và chuyển đổi nó thành một String bằng cách sử dụng phương thức toString().Chuyển đổi HashMap.toString() trở lại HashMap trong Java

Có thể chuyển đổi đối tượng String này trở lại đối tượng HashMap và truy lục giá trị bằng khóa tương ứng không?

Cảm ơn

+0

Câu hỏi không đúng, thường là đối tượng-> toString() là một chuyển đổi một chiều. Đôi khi toString() -> đối tượng có thể đạt được, nhưng không phải với tất cả các lớp. Sử dụng tốt hơn objectOutputStream như trong một số câu trả lời. – iirekm

Trả lời

6

Khi bạn chuyển đổi HashMap thành chuỗi bằng cách sử dụng toString(); Nó không phải là bạn có thể chuyển đổi nó trở lại Hashmap từ chuỗi đó, chỉ biểu diễn chuỗi của nó.

Bạn có thể vượt qua các tài liệu tham khảo để HashMap phương pháp hoặc bạn có thể serialize nó

Dưới đây là mô tả cho toString() toString()
Here là mã mẫu với lời giải thích cho serialization.

và để chuyển hashMap vào phương thức dưới dạng arg.

public void sayHello(Map m){ 

} 
//calling block 
Map hm = new HashMap(); 
sayHello(hm); 
+0

Cảm ơn bạn đã trả lời. –

+0

plz, bạn có thể giải thích chi tiết hơn không. –

+0

@sam cập nhật nó –

3

Bạn đã thử gì?

objectOutputStream.writeObject(hashMap); 

chỉ hoạt động tốt, với điều kiện tất cả các đối tượng trong hashMap đều có thể thực hiện được.

+0

Cảm ơn bạn đã trả lời plz, bạn có thể giải thích chi tiết hơn không. –

0

Có thể xây dựng lại một bộ sưu tập ra khỏi trình bày chuỗi của nó nhưng nó sẽ không hoạt động nếu các yếu tố của bộ sưu tập không ghi đè các phương pháp toString riêng của họ.

Do đó, việc sử dụng thư viện của bên thứ ba an toàn hơn và dễ dàng hơn như XStream sẽ truyền các đối tượng trong XML có thể đọc được của con người.

3

Bạn không thể hoàn nguyên về chuỗi từ đối tượng. Vì vậy, bạn sẽ cần phải làm điều này:

HashMap<K, V> map = new HashMap<K, V>(); 

//Write: 
OutputStream os = new FileOutputStream(fileName.ser); 
ObjectOutput oo = new ObjectOutputStream(os); 
oo.writeObject(map); 
oo.close(); 

//Read: 
InputStream is = new FileInputStream(fileName.ser); 
ObjectInput oi = new ObjectInputStream(is); 
HashMap<K, V> newMap = oi.readObject(); 
oi.close(); 
5

tôi chuyển HashMap thành một chuỗi sử dụng toString() phương pháp và chuyển cho các một phương pháp mà phải mất một String và chuyển đổi chuỗi này vào HashMap đối tượng

Đây là cách rất, rất xấu cách để vượt qua một HashMap.

Về mặt lý thuyết nó có thể hoạt động, nhưng có quá nhiều thứ có thể sai (và nó sẽ hoạt động rất tồi). Rõ ràng, trong trường hợp của bạn có điều gì đó không ổn. Chúng tôi không thể nói những gì mà không nhìn thấy mã của bạn.

Nhưng giải pháp tốt hơn nhiều là thay đổi "phương pháp khác" để chỉ cần tham số HashMap thay vì biểu diễn chuỗi của một.

+2

Tôi nghĩ rằng anh ấy có nghĩa là các phương pháp được gọi ở các trường hợp khác nhau. i.e Instance Một serializes 'Map' thành chuỗi và instance B phải deserialize chuỗi thành một đối tượng' Map'. – TheRealChx101

16

Nó sẽ hoạt động nếu toString() chứa tất cả dữ liệu cần thiết để khôi phục đối tượng.Ví dụ: nó sẽ làm việc cho bản đồ của chuỗi (nơi chuỗi được sử dụng làm khóa và giá trị):

// create map 
Map<String, String> map = new HashMap<String, String>(); 
// populate the map 

// create string representation 
String str = map.toString(); 

// use properties to restore the map 
Properties props = new Properties(); 
props.load(new StringReader(str.substring(1, str.length() - 1).replace(", ", "\n")));  
Map<String, String> map2 = new HashMap<String, String>(); 
for (Map.Entry<Object, Object> e : props.entrySet()) { 
    map2.put((String)e.getKey(), (String)e.getValue()); 
} 

Điều này làm việc mặc dù tôi thực sự không hiểu tại sao bạn lại cần điều này.

+1

'map.put (" k = 2 "," v = 2 "); System.out.println (map2.get ("k = 2")); 'đầu ra là:' null' – seyed

2

Bạn có bị giới hạn chỉ sử dụng HashMap ??

Tại sao nó không thể linh hoạt như vậy JSONObject bạn có thể làm được rất nhiều với nó.

Bạn có thể chuyển đổi String jsonString để JSONObject jsonObj

JSONObject jsonObj = new JSONObject(jsonString); 
Iterator it = jsonObj.keys(); 

while(it.hasNext()) 
{ 
    String key = it.next().toString(); 
    String value = jsonObj.get(key).toString(); 
} 
2

bạn không thể làm điều này trực tiếp nhưng tôi đã làm điều này một cách điên như sau ...

Ý tưởng cơ bản là, 1 bạn cần phải chuyển đổi HashMap String vào Json sau đó bạn có thể deserialize Json sử dụng Gson/Genson vv vào HashMap một lần nữa.

@SuppressWarnings("unchecked") 
private HashMap<String, Object> toHashMap(String s) { 
    HashMap<String, Object> map = null; 
    try { 
     map = new Genson().deserialize(toJson(s), HashMap.class); 
    } catch (TransformationException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return map; 
} 

private String toJson(String s) { 
    s = s.substring(0, s.length()).replace("{", "{\""); 
    s = s.substring(0, s.length()).replace("}", "\"}"); 
    s = s.substring(0, s.length()).replace(", ", "\", \""); 
    s = s.substring(0, s.length()).replace("=", "\":\""); 
    s = s.substring(0, s.length()).replace("\"[", "["); 
    s = s.substring(0, s.length()).replace("]\"", "]"); 
    s = s.substring(0, s.length()).replace("}\", \"{", "}, {"); 
    return s; 
} 

thực hiện ...

HashMap<String, Object> map = new HashMap<String, Object>(); 
map.put("Name", "Suleman"); 
map.put("Country", "Pakistan"); 
String s = map.toString(); 
HashMap<String, Object> newMap = toHashMap(s); 
System.out.println(newMap); 
0

Tôi hy vọng bạn thực sự cần phải nhận được giá trị từ chuỗi bằng cách thông qua phím hashmap. Nếu đúng như vậy, thì chúng ta không phải chuyển đổi nó về Hashmap. Sử dụng phương pháp sau đây và bạn sẽ có thể nhận được giá trị như thể nó được lấy từ chính Hashmap.

String string = hash.toString(); 
String result = getValueFromStringOfHashMap(string, "my_key"); 

/** 
* To get a value from string of hashmap by passing key that existed in Hashmap before converting to String. 
* Sample string: {fld_category=Principal category, test=test 1, fld_categoryID=1} 
* 
* @param string 
* @param key 
* @return value 
*/ 
public static String getValueFromStringOfHashMap(String string, String key) { 


    int start_index = string.indexOf(key) + key.length() + 1; 
    int end_index = string.indexOf(",", start_index); 
    if (end_index == -1) { // because last key value pair doesn't have trailing comma (,) 
     end_index = string.indexOf("}"); 
    } 
    String value = string.substring(start_index, end_index); 

    return value; 
} 

Có công việc cho tôi không.

0

Điều này có thể không hiệu quả và gián tiếp. Nhưng

String mapString = "someMap.toString()"; 
    new HashMap<>(net.sf.json.JSONObject.fromObject(mapString)); 

nên hoạt động !!!

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