我从一个csv文件中读取,该文件的列中包含一列中的键值对。来自csv文件的示例:
Country Product Baseurl ParamAndMacro
USA Oil http://usa.com key={value}&key2={value2}&key3={value3}
我尝试拆分名为 ParamAndMacro 的列,并按密钥值对将其存储在hashMap中。 我的第一次尝试,我成功地使用split函数分割字符串:
public Map<String, String> splitString(String s) {
// String s represents ParamAndMacro
String[] split = s.split("=|\\&");
int length = split.length;
Map<String, String> maps = new HashMap<>();
for (int i=0; i<length; i+=2){
maps.put(split[i], split[i+1]);
}
return maps;
}
这有效,但它不会检查角落情况。例如"key={value}&key2={value2}&key3="
或"key={value}&key2={value2}&key3=&"
,因为这将引发异常。基本上,如果值为空,则存储具有键和空值的对象。 例如:{key3=}
。此外,如果缺少密钥,请不要将其存储在地图中,即使用记录器报告错误,跳过它并继续。到目前为止,我已尝试一次通过,但我没有检查是否缺少一个密钥。下面是我的实现,我的算法如何以及它是否有效。
所以我在下面实现了分割功能:
public Map<String, String> splitString(String s){
Map<String, String> maps = new HashMap<>();
int length = s.length();
StringBuilder sb = new StringBuilder();
String key = "";
String value = "";
char prev = ' ';
for (int i=0; i<length; i++) {
char a = s.charAt(i);
if ( a != '=' && a != '&' && prev != a) {
sb.append(a);
}
else if( a == '=' && prev != a && prev != '&') {
key = sb.toString();
sb = new StringBuilder();
}
else if (a=='&' && prev != a && prev != '=') {
value = sb.toString();
sb = new StringBuilder();
maps.put(key, value);
}
else if (prev=='=' && a == '&') {
value = "";
maps.put(key, value);
sb = new StringBuilder();
}
prev = a;
}
return maps;
}
**注意:**我正在读取csv文件。参数和宏可能很长,也想知道我的算法在一次通过中是否有效。
预期产出
key={value}&key2={value2}&key3=&
是:
输出: {key={value}, key2={value2}, key3=}
key={value}&key2={value2}&key3=
是:
输出: {key={value}, key2={value2}, key3=}
key={value}&{value2}&key3=
是:
输出: {key={value}, key3="}
={value}&key2={value2}&key3=
是:
输出: {key2={value2}, key3=}