key=value&的字符转map

本文介绍了如何处理包含多个=和&的key=value&格式字符串,通过栈来拆分字符串并构建Map。重点在于确保每个&之间存在=号,并且第一个=号前的字符串作为key,其余的=号不进行拆分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请说明!!!

最近需要用到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));
        
    }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值