String
をHashMap
に変換するにはどうすればよいですか?
String value = "{first_name = naresh, last_name = kumar, gender = male}"
に
Map<Object, Object> = {
first_name = naresh,
last_name = kumar,
gender = male
}
キーはfirst_name
、last_name
およびgender
および値はnaresh
、kumar
、male
です。
注:キーはcity = hyderabad
。
一般的なアプローチを探しています。
これは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
を使用している場合。
String value = "{first_name = naresh,last_name = kumar,gender = male}"
始めましょう
String
>> first_name = naresh、last_name = kumar、gender = maleから{
および}
を削除します,
>>配列からString
を分割します3
要素を持つarray
ができましたarray
を繰り返し、各要素を=
で分割しますMap<String,String>
を作成し、各部分を=
で区切って配置します。最初の部分はKey
として、2番目の部分はValue
としてGson をかなり自由に使用しているため、Gsonベースのアプローチを共有できます。
_Map<Object,Object> attributes = gson.fromJson(gson.toJson(value)),Map.class);
_
それは何ですか:
gson.toJson(value)
は、オブジェクトを同等のJson表現にシリアル化します。gson.fromJson
_は、Json文字列を指定されたオブジェクトに変換します。 (この例では-Map
)このアプローチの柔軟性は、Stringの代わりにObjectをtoJson
メソッドに渡すことができることです。
@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())));
}