Map<String,Object> inputMap=new HashMap<String,Object>();
inputMap.put("a","abc");
inputMap.put("b","bcd");
inputMap.put("c","cde");
HashMap<String,String> subMap=new HashMap<String,String>();
subMap.put("x","xyz");
subMap.put("z","klm")
inputMap.put("d",subMap);
String output=inputMap.toString();
System.out.println(output);
{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}}
输出为:{a = abc,b = bcd,c = cde,d = {x = xyz,z = klm}} ;
如何将输出转换回地图?
提前致谢。
答案 0 :(得分:1)
有没有办法可以将字符串转换回地图?
一般来说,不是。
Map<K,V>.toString()
实施依赖于K.toString()
和V.toString()
实施。这些是不可逆的,这意味着Map
实现也不能。
即使在Map<String,String>
情况下,渲染的地图也不会使用任何形式的转义来处理边缘情况......比如包含逗号,等号或大括号的键或值
在受限制的情况下 1 ,您可以实现自己的解析器,或者您可以使用此处描述的方法之一:
但是,如果您还需要转换是可逆的,那么使用toString()
是一个不好的想法。 toString()
方法合同及其实现不是为此目的而设计的。它们主要用于调试。
1 - 例如,如果您认为K
和V
为String
,则没有null
个键或值,也不会包含尴尬的人物。
2 - 注意:使用split
等的简单解决方案通常不会处理嵌套地图。
答案 1 :(得分:0)
没有预定义的Java方法但您可以使用自己的逻辑进行编码。 我在这里分享我的工作实例。 您可以根据需要更改代码
String output="{a=abc,b=bcd,c=cde,d={x=xyz,z=klm}}";
if(output.indexOf("{")==0 && output.lastIndexOf("}")==output.length()-1) {
output=output.substring(1, output.length()-1);
HashMap<String, String> convertedMap=convert(output);
for (HashMap.Entry<String, String> value:convertedMap.entrySet()) {
if(value.getValue().indexOf("{")==0 && value.getValue().lastIndexOf("}")==value.getValue().length()-1) {
String valueWithBracket=value.getValue();
convertedMap.remove(value);
convertedMap=convert(valueWithBracket);
}
}
}
public static HashMap<String, String> convert(String str) {
HashMap<String, String> map = new HashMap<String, String>();
String[] tokens = str.split(",(?![^{)]*\\})");
for (String token: tokens) {
String[] val=token.split("=(?![^{)]*\\})");
for (int i=0;i<val.length;i=i+2) {
map.put(val[i], val[i+1]);
}
}
return map;
}
public static HashMap<String, String> removeBracketAndConvert(String str){
if(str.indexOf("{")==0 && str.lastIndexOf("}")==str.length()-1) {
str=str.substring(1, str.length()-1);
return convert(str);
}
return convert(str);
}