web-dev-qa-db-ja.com

javaで文字列をハッシュマップに変換する方法

StringHashMapに変換するにはどうすればよいですか?

String value = "{first_name = naresh, last_name = kumar, gender = male}"

Map<Object, Object> = {
    first_name = naresh,
    last_name = kumar,
    gender = male
}

キーはfirst_namelast_nameおよびgenderおよび値はnareshkumarmaleです。

注:キーはcity = hyderabad

一般的なアプローチを探しています。

20
Naresh kumar

これは1つの解決策です。より汎用的にしたい場合は、StringUtilsライブラリを使用できます。

String value = "{first_name = naresh,last_name = kumar,gender = male}";
value = value.substring(1, value.length()-1);           //remove curly brackets
String[] keyValuePairs = value.split(",");              //split the string to creat key-value pairs
Map<String,String> map = new HashMap<>();               

for(String pair : keyValuePairs)                        //iterate over the pairs
{
    String[] entry = pair.split("=");                   //split the pairs to get key and value 
    map.put(entry[0].trim(), entry[1].trim());          //add them to the hashmap and trim whitespaces
}

たとえば、切り替えることができます

 value = value.substring(1, value.length()-1);

 value = StringUtils.substringBetween(value, "{", "}");

Apache.commons.langパッケージに含まれるStringUtilsを使用している場合。

42
kai
String value = "{first_name = naresh,last_name = kumar,gender = male}"

始めましょう

  1. String >> first_name = naresh、last_name = kumar、gender = maleから{および}を削除します
  2. 3要素の, >>配列からStringを分割します
  3. これで、3要素を持つarrayができました
  4. arrayを繰り返し、各要素を=で分割します
  5. Map<String,String>を作成し、各部分を=で区切って配置します。最初の部分はKeyとして、2番目の部分はValueとして

Gson をかなり自由に使用しているため、Gsonベースのアプローチを共有できます。

_Map<Object,Object> attributes = gson.fromJson(gson.toJson(value)),Map.class);
_

それは何ですか:

  1. gson.toJson(value)は、オブジェクトを同等のJson表現にシリアル化します。
  2. _gson.fromJson_は、Json文字列を指定されたオブジェクトに変換します。 (この例では-Map

このアプローチの柔軟性は、Stringの代わりにObjectをtoJsonメソッドに渡すことができることです。

0
tryingToLearn
@Test
public void testToStringToMap() {
    Map<String,String> expected = new HashMap<>();
    expected.put("first_name", "naresh");
    expected.put("last_name", "kumar");
    expected.put("gender", "male");
    String mapString = expected.toString();
    Map<String, String> actual = Arrays.stream(mapString.replace("{", "").replace("}", "").split(","))
            .map(arrayData-> arrayData.split("="))
            .collect(Collectors.toMap(d-> ((String)d[0]).trim(), d-> (String)d[1]));

    expected.entrySet().stream().forEach(e->assertTrue(actual.get(e.getKey()).equals(e.getValue())));
}
0
Hiren