从字符串里面解析数组

需求,从一个字符串里面,解析出一个数组。

例如:

“1,2,3,4,5”,

"1-5",

"1,2,4",

"5-10,

12,13"

能正常解析出一个数组出来。字符串里面,支持“,”, "-" 2种用法。

 

#include <iostream>  
#include <string>  
#include <vector>  
#include <sstream>  
#include <unordered_map>
  
std::vector<int> parseStringToInts(const std::string& input) {  
    std::vector<int> result;  
    std::string token;  
    std::stringstream ss(input);  
    std::unordered_map<int, int> unorderMap;//去重判断
  
    while (std::getline(ss, token, ',')) {  
        // 检查是否包含'-',表示范围  
        size_t dashPos = token.find('-');  
        if (dashPos != std::string::npos) {  
            // 提取范围的两个数字  
            int start, end;  
            std::stringstream startStream(token.substr(0, dashPos));  
            std::stringstream endStream(token.substr(dashPos + 1));  
            if (startStream >> start && endStream >> end && start <= end) {  
                // 添加范围内的所有数字  
                for (int i = start; i <= end; ++i) {  
                    if(unorderMap.find(i) == unorderMap.end()){
                        result.push_back(i);  
                        unorderMap[i] = 1;
                    }
                }  
            }  
        } else {  
            // 否则,尝试将token转换为整数  
            int num;  
            if (std::stringstream(token) >> num) {  
                if(unorderMap.find(num) == unorderMap.end()){
                    result.push_back(num);  
                    unorderMap[num] = 1;
                }
            }  
            // 如果转换失败,忽略此token(可选,取决于你的需求)  
        }  
    }  
  
    return result;  
} 


// 测试示例  
void testFun(const std::string& strIds){
    std::cout<<"=======================\r\ntestFun strIds:"<<strIds<<std::endl;
    std::vector<int> result; 
    result = parseStringToInts(strIds);  
    for (int num : result) {  
        std::cout << num << " ";  
    }  
    std::cout << std::endl;  
}

  
int main() {  
    testFun("1,2,3,4,5");
    testFun("1-5");
    testFun("1,3,5,7");
    testFun("1,3,5-6,7,9");
    testFun("");
    testFun("1-5,8");
    testFun("1-,8");
    testFun("-2,8");
    testFun("8-8,8");
    testFun("8-3");
    testFun("-2");
    testFun("1-4,6-8");
    testFun("1-3,6,7,9-10");
    testFun("6,7,9-10,18");
    testFun("a");
    testFun("b");
    testFun("0-5");
    return 0;  
}

 

posted @ 2024-08-14 10:30  He_LiangLiang  阅读(5)  评论(0编辑  收藏  举报