web-dev-qa-db-ja.com

JavaでHashMap.toString()をHashMapに戻す

キーと値のペアをJava HashMapに入れ、toString()メソッドを使用してStringに変換しました。

このString表現をHashMapオブジェクトに戻し、対応するキーで値を取得することは可能ですか?

ありがとう

28
Sameek Mishra

toString()アプローチはtoString()の実装に依存しており、ほとんどの場合、損失を伴う可能性があります。

ここに非損失性のソリューションはありません。しかし、より良い方法は、オブジェクトのシリアル化を使用することです

オブジェクトを文字列にシリアル化します

private static String serialize(Serializable o) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(o);
    oos.close();
    return Base64.getEncoder().encodeToString(baos.toByteArray());
}

文字列を逆シリアル化してオブジェクトに戻す

private static Object deserialize(String s) throws IOException,
        ClassNotFoundException {
    byte[] data = Base64.getDecoder().decode(s);
    ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data));
    Object o = ois.readObject();
    ois.close();
    return o;
}

ここで、ユーザーオブジェクトに一時的なフィールドがある場合、それらはプロセスで失われます。


古い答え


ToString()を使用してHashMapをStringに変換したら、それをその文字列からハッシュマップに変換して戻すことができるわけではありません。その文字列表現です。

HashMapへの参照をメソッドに渡すか、シリアル化できます。

ToString() toString() の説明を次に示します。
ここ は、シリアル化の説明付きのサンプルコードです。

hashMapをargとしてメソッドに渡します。

public void sayHello(Map m){

}
//calling block  
Map  hm = new HashMap();
sayHello(hm);
11
Jigar Joshi

ToString()にオブジェクトの復元に必要なすべてのデータが含まれている場合に機能します。たとえば、文字列のマップに対して機能します(文字列はキーと値として使用されます)。

// 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());
}

これは機能しますが、なぜあなたはこれが必要なのか本当に分かりません。

20
AlexR

これを直接行うことはできませんが、以下のようにクレイジーな方法でこれを行いました...

基本的な考え方は、最初にHashMap StringをJsonに変換する必要があり、その後Gson/Gensonなどを使用してJsonをHashMapに再びシリアル化解除できるということです。

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

実装...

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);
5

toString()メソッドを使用してHashMapをStringに変換し、Stringを取得してこのStringをHashMapオブジェクトに変換する別のメソッドに渡します

これは非常に、非常に悪い HashMapを渡す方法です。

理論的には機能しますが、うまくいかない場合があります(そして、パフォーマンスが非常に悪くなります)。明らかに、あなたの場合、何かがおかしくなります。あなたのコードを見ずに何を言うことはできません。

しかし、はるかに優れた解決策は、その「別のメソッド」を変更して、1つのストリング表現ではなくHashMapをパラメーターとして使用することです。

5

何をしようとしましたか?

objectOutputStream.writeObject(hashMap);

hashMap内のすべてのオブジェクトがSerializableを実装していれば、問題なく動作するはずです。

3
djna

文字列からオブジェクトに戻すことはできません。したがって、これを行う必要があります。

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();
3
zengr

HashMapのみの使用に制限されていますか??

なぜそれほど柔軟にならないのかJSONObjectそれで多くのことができる。

String jsonStringJSONObject jsonObjに変換できます

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

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

これは非効率的で間接的な場合があります。しかし

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

動作するはずです!!!

0
Akash EJ

文字列表示からコレクションを再構築することは可能ですが、コレクションの要素が独自のtoStringメソッドをオーバーライドしないと機能しません。

したがって、人間が読めるXMLでオブジェクトをストリーミングする XStream のようなサードパーティライブラリを使用する方がはるかに安全で簡単です。

0
Boris Pavlović

ハッシュマップキーを渡すことで、実際に文字列から値を取得する必要があることを願っています。その場合、変換してハッシュマップに戻す必要はありません。次のメソッドを使用すると、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;
}

私のために仕事をします。

0
Ayush Goyal