当前位置: 首页 > news >正文

C#实现HiveQL建表语句中特殊数据类型的包裹

用C#实现搜索字符串中用’(‘和’)‘包裹的最外层的里面里面的字符串,将里面的记录按一个或多个空格、换行或tab,或者是它的在一起的组合作为分隔,分隔出多个字符串组,如果组中有字符串中同时包含’<‘和’>’,则在原始的字符串中该字符串的位置的前后插入字符`,最后返回修改过后的字符串,优化这个字符串处理算法,并给出所有的测试用例。

以下是C#代码,包括优化后的算法和测试用例:

using System;
using System.Collections.Generic;
using System.Text;

public class StringProcessor
{
    public string ProcessString(string input)
    {
        var outerPairs = FindOuterParenthesesPairs(input);
        List<int> insertPositions = new List<int>();

        foreach (var (start, end) in outerPairs)
        {
            if (start > end)
                continue;

            string substr = input.Substring(start, end - start + 1);
            var groups = SplitIntoGroups(substr);

            foreach (var group in groups)
            {
                int groupStartInSubstr = group.Start;
                int groupEndInSubstr = group.End;

                bool hasLT = false;
                bool hasGT = false;
                for (int i = groupStartInSubstr; i <= groupEndInSubstr; i++)
                {
                    char c = substr[i];
                    if (c == '<') hasLT = true;
                    else if (c == '>') hasGT = true;
                    if (hasLT && hasGT) break;
                }

                if (hasLT && hasGT)
                {
                    int originalStart = start + groupStartInSubstr;
                    int originalEnd = start + groupEndInSubstr;
                    insertPositions.Add(originalStart);
                    insertPositions.Add(originalEnd + 1);
                }
            }
        }

        insertPositions.Sort((a, b) => b.CompareTo(a));
        StringBuilder sb = new StringBuilder(input);
        foreach (int pos in insertPositions)
        {
            sb.Insert(pos, '`');
        }
        return sb.ToString();
    }

    private List<(int Start, int End)> FindOuterParenthesesPairs(string input)
    {
        List<(int, int)> pairs = new List<(int, int)>();
        int depth = 0;
        int currentStart = -1;

        for (int i = 0; i < input.Length; i++)
        {
            char c = input[i];
            if (c == '(')
            {
                depth++;
                if (depth == 1)
                {
                    currentStart = i + 1;
                }
            }
            else if (c == ')')
            {
                depth--;
                if (depth == 0 && currentStart != -1)
                {
                    int currentEnd = i - 1;
                    if (currentStart <= currentEnd)
                    {
                        pairs.Add((currentStart, currentEnd));
                    }
                    currentStart = -1;
                }
            }
        }
        return pairs;
    }

    private List<(int Start, int End)> SplitIntoGroups(string substr)
    {
        List<(int, int)> groups = new List<(int, int)>();
        int currentGroupStart = -1;

        for (int i = 0; i < substr.Length; i++)
        {
            if (IsWhitespace(substr[i]))
            {
                if (currentGroupStart != -1)
                {
                    groups.Add((currentGroupStart, i - 1));
                    currentGroupStart = -1;
                }
            }
            else
            {
                if (currentGroupStart == -1)
                {
                    currentGroupStart = i;
                }
            }
        }

        if (currentGroupStart != -1)
        {
            groups.Add((currentGroupStart, substr.Length - 1));
        }

        return groups;
    }

    private bool IsWhitespace(char c)
    {
        return c == ' ' || c == '\t' || c == '\n' || c == '\r';
    }
}

public class Program
{
    public static void Main()
    {
        var processor = new StringProcessor();
        RunTestCases(processor);
    }

    private static void RunTestCases(StringProcessor processor)
    {
        // 测试用例
        TestCase(processor, "", ""); // 空字符串
        TestCase(processor, "hello world", "hello world"); // 无括号
        TestCase(processor, "()", "()"); // 空括号
        TestCase(processor, "(a b c)", "(a b c)"); // 无<和>
        TestCase(processor, "(a <b> c)", "(a `<b>` c)"); // 单个<和>
        TestCase(processor, "(a <b) c)", "(a <b) c)"); // 不匹配的<和)
        TestCase(processor, "((a <b>))", "((a `<b>`))"); // 嵌套括号
        TestCase(processor, "(a\t<b>\n)", "(a\t`<b>`\n)"); // 混合空白符
        TestCase(processor, "( <a> <b> )", "( `<a>` `<b>` )"); // 多个组
        TestCase(processor, "start(middle<test> end)finish", "start(middle `<test>` end)finish"); // 混合内容
        TestCase(processor, "(a<b<c>>d)", "(a`<b<c>>`d)"); // 复杂嵌套<>
    }

    private static void TestCase(StringProcessor processor, string input, string expected)
    {
        string result = processor.ProcessString(input);
        Console.WriteLine($"Input:    {input}");
        Console.WriteLine($"Expected: {expected}");
        Console.WriteLine($"Result:   {result}");
        Console.WriteLine($"Test {(result == expected ? "Passed" : "Failed")}\n");
    }
}

测试用例说明:

  1. 空字符串:输入为空,输出保持不变。
  2. 无括号:输入中没有括号,直接返回原字符串。
  3. 空括号:括号内无内容,不做处理。
  4. 无<和>的组:括号内的组不包含<和>,不插入反引号。
  5. 单个符合条件的组:组包含<和>,插入反引号。
  6. 不匹配的符号:组内只有<,不插入。
  7. 嵌套括号:仅处理最外层括号内的内容。
  8. 混合空白符:正确处理制表符和换行符。
  9. 多个组:每个符合条件的组独立处理。
  10. 混合内容:括号内外混合内容处理。
  11. 复杂嵌套符号:组内包含多个<和>符号。
http://www.dtcms.com/a/108347.html

相关文章:

  • 用docker部署goweb项目
  • RainbowDash 的 Robot
  • C++学习笔记(三十一)——map
  • Git的基础使用方法
  • 微信小程序唤起app
  • 【Docker】使用Docker快速部署n8n和unclecode/crawl4ai
  • PEFT实战(一)——LoRA
  • 大模型学习一:deepseek api 调用实战以及参数介绍
  • 【动手学深度学习】#7 现代卷积神经网络
  • C++多态:从青铜九鼎到虚函数表的千年演化密码
  • Pytorch|RNN-心脏病预测
  • 文件分享系统--使用AI Trae开发前后端
  • 鸿蒙应用元服务开发-Account Kit获取华为账号用户信息概述
  • 魔塔社区使用llamafactory微调AI阅卷试题系统
  • 应用弥散张量成像和支持向量机检测慢性爆炸相关轻度颅脑损伤
  • Dockerfile文件构建镜像Anaconda+Python教程
  • 六十天Linux从0到项目搭建(第十八十九天)(缓冲区机制、未打开的磁盘存放、文件存储、磁盘物理结构、寻址、块设备管理、文件系统、增删查改、硬链接、软链接)
  • 通俗易懂的解释Git操作中“合并”和“变基”的区别
  • CMD命令通过已知ip使用以下三种方式来获取对方主机名
  • 常见优化SQL语句策略和示例
  • ControlNet-Tile详解
  • 最新Spring Security实战教程(八)Remember-Me实现原理 - 持久化令牌与安全存储方案
  • Python数据可视化-第3章-图表辅助元素的定制
  • PyTorch 中池化层MaxPool2d
  • CSS--解决float: right在空间不够时会自动往下移的问题
  • 音视频入门基础:MPEG2-TS专题(26)——通过FFmpeg命令使用RTP发送TS流
  • 【Word】批注一键导出:VBA 宏
  • C#核心学习(五)面向对象--封装(4)C#中的索引器详解:让对象像数组一样灵活访问
  • MySQL的数据目录以及日志
  • 企业网络优化方案:SD-WAN赋能企业远程办公