转载请说明!!!
最近需要用到key=value&的字符转map的操作,因为value里面可能会有多个=号或&符号,之前其他同事写的有点问题,自己写了一个,用栈来保存用&符号拆分出来的字符串,然后只需要保证两点:1、每个&之间必须要有个=号才做分割;2、map里面第一个=号前面就是key,后面的=号不做拆分。代码如下:
package stack;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class KeyValueTransfer {
public static void main(String[] args) {
String testStr;
testStr = "&&&&&&&";
System.out.println( String2Map(testStr).toString());
testStr = "a=b&c=d&e&sign=jdsafkjsajfk==&test=&&&";
System.out.println( String2Map(testStr).toString());
}
/**
*
* @param dealStr 要处理的字符串
* @return
*/
public static Map<String, String> String2Map(String dealStr) {
Map<String, String> paraMap = new HashMap<String, String>();
//1、两个&符号分割中间至少要有一个等号
if (dealStr != null && !dealStr.isEmpty()) {
Stack paraPairStack = new Stack();//&拆分出来的栈
int splitAndIndex;//最新的&下标
String splitStr;//&符号分割出来的字符串
while(dealStr.length() > 0) {
splitAndIndex = dealStr.indexOf("&");
if (splitAndIndex == -1) {
//没有&的情况
if (!dealStr.contains("=")) {
//剩下的字符串没有键值对,则添加到上一个栈中
appendToPreStack(paraPairStack, dealStr, dealStr.length());
break;
}
}else if(splitAndIndex == 0){
//第一个字符就是&,则添加到上一栈中
appendToPreStack(paraPairStack, dealStr, splitAndIndex);
}else{
splitStr = dealStr.substring(0, splitAndIndex);
if(!splitStr.contains("=")){
//第一个字符就是&,则添加到上一栈中
appendToPreStack(paraPairStack, dealStr, splitAndIndex);
}else{
paraPairStack.push(splitStr);
}
}
dealStr = dealStr.substring(splitAndIndex + 1);
}
//2、&分割完的栈,只分割第一个等号作为对于的key 和 value
String preKey = "";
for(Object paraPair : paraPairStack){
String paraPairStr = paraPair.toString();
int equalIndex = paraPairStr.indexOf("=");
if(equalIndex == -1){
//字符串开头就是=
preKey = "";
}else {
preKey = paraPairStr.substring(0, equalIndex);
}
paraMap.put(preKey, paraPairStr.substring(equalIndex+1));
}
}
return paraMap;
}
/**
*
* @param paraPairStack 存储用&分割后的字符串的栈
* @param dealStr 剩余还没分割的字符串
* @param length &后面字符串的长度
*/
private static void appendToPreStack(Stack paraPairStack, String dealStr, int length) {
paraPairStack.push((paraPairStack.empty() ? "" : paraPairStack.pop()) + "&" + dealStr.substring(0, length));
}
}