这是前天遇到的一个面试题:

=== 字典序列列化 ===
我们程序中⽤用到了了⼀一个数组 a ,数组的每个元素都是⼀一个字典(map/dict)。
字典的 key/value 都是字符串串,字符串串中可包含任意字符。
示例例:
a[0][\"k1\"] = \"v1\"
a[0][\"k2\"] = \"v2\"
a[1][\"A\"] = \"XXX\"
...
实际使⽤用过程中,我们⾃自定义了了⼀一个基于字符串串的存储结构,数组元素之间⽤用“换⾏行行”分割,
字典元素之间使⽤用“分号”分割, key/value 之间⽤用“等号”分割。
上述数据序列列化之后,应该得到⼀一个字符串串:
\"k1=v1;k2=v2\\nA=XXX\"
请实现⼀一个“保存”函数、⼀一个“加载”函数。
text = store(a); //把数组保存到⼀一个字符串串中
a = load(text); //把字符串串中的内容读取为字典数组
请考虑所有边界情况,不不要出现bug。在满⾜足上述需求的前提下,可⾃自⾏行行增加⼀一些规则和约
定。

保存方法:

public String getString(List<Map<String,String>> list) {
		String str = \"\";
		for (Map<String, String> map : list) {
			Set<Entry<String,String>> entrySet = map.entrySet();
			
			for (Entry<String, String> entry : entrySet) {
				String key = entry.getKey();
				String value = entry.getValue();
				str+=(key+\"=\"+value+\";\");
			}
			str = str.substring(0, str.length()-1);
			str = str+\"\\\\n\";
		}
		
		str = str.substring(0, str.length()-2);
		return str;
	}

格式化方法

public List<Map<String,String>> load(String string){
		String[] split = string.split(\"\\\\\\\\n\");
		List<Map<String,String>> list = new ArrayList<>();
		for (String string2 : split) {
			String[] split2 = string2.split(\";\");
			Map<String,String> map= new HashMap<>();
			for (String string3 : split2) {
				String[] split3 = string3.split(\"=\");
				map.put(split3[0],split3[1]);
			}
			list.add(map);
		}
		return list;
	}

测试方法

List<Map<String,String>> list = new ArrayList<>();
		Map<String,String> map = new HashMap<>();
		map.put(\"k1\", \"v1\");
		map.put(\"k2\", \"v2\");
		
		Map<String,String> map2 = new HashMap<>();
		map2.put(\"z1\", \"zv1\");
		map2.put(\"z2\", \"zv2\");
		
		list.add(map);
		list.add(map2);
		test tt = new test();
		String formate = tt.getString(list);
		System.out.println(\"序列化参数---------->\"+formate);
		List<Map<String,String>> load = tt.load(formate);
		System.out.println(\"参数加载---------->\"+load.toString());

测试结果

序列化参数---------->k1=v1;k2=v2\\nz1=zv1;z2=zv2
参数加载---------->[{k1=v1, k2=v2}, {z1=zv1, z2=zv2}]

各位看官如有更优解法,欢迎交流

收藏 打印