当前位置:  开发笔记 > 编程语言 > 正文

一种"松散"CamelCased字符串的算法

如何解决《一种"松散"CamelCased字符串的算法》经验,为你挑选了1个好方法。

非常基本,我只是好奇其他人如何实现这个算法,并希望看看是否有任何聪明的技巧来优化算法......我只需要为我正在研究的项目实现这个.

鉴于CamelCase中有一个字符串,你会如何"区分"它呢?

例如,给予FooBarGork我想要Foo Bar Gork.

这是我在C#中的算法:


static void Main(string[] args)
{
    Console.WriteLine(UnCamelCase("FooBarGork"));
}
public static string UnCamelCase(string str)
{
    StringBuilder sb = new StringBuilder();
    for (int i =  0; i < str.Length; i++)
    {
        if (char.IsUpper(str, i) && i > 0) sb.Append(" ");
        sb.Append(str[i]);
    }
    return sb.ToString();
}

由于你必须访问每个角色一次,我相信最好的情况是O(n).你会如何实现这个?



1> Sean Bright..:

我已经可以感受到火焰,但我喜欢这种东西的正则表达式.

public static string UnCamelCase(string str)
{
    return Regex.Replace(str, "([a-z])([A-Z])", "$1 $2");
}

(这可能不比你的实现快,但对来说更清楚.)

显然,这会更快(在运行时)

private static Regex _unCamelRegex = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);

public static string UnCamelCase(string str)
{
    return _unCamelRegex.Replace(str, "$1 $2");
}

这将处理Pete Kirkham 在下面提出的问题(就像HTTPRequest这样的像驼峰一样的字符串):

private static Regex _unCamelRegex1 = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);
private static Regex _unCamelRegex2 = new Regex("([A-Z]+)([A-Z])([a-z])", RegexOptions.Compiled);

public static string UnCamelCase(string str)
{
    return _unCamelRegex2.Replace(_unCamelRegex1.Replace(str, "$1 $2"), "$1 $2$3");
}

这个拿走HTTPRequestFOOBarGork并返回HTTP Request FOO Bar Gork


所以我使用OPs实现(使用'从1开始并跳过> 0检查'更改)和我的第二个回复(具有静态编译的Regex对象的回复)来对正则表达式方法测试迭代方法.请注意,结果不包括正则表达式的编译时间.对于200万次调用(使用相同的FooBarGork输入):

迭代: 00 :00:00.80正则
表达式: 00:00:06.71

所以很明显,迭代的方法是很多更有效.我已经包含了OPs实现的固定版本(正如 Jason Punyon 所建议的那样,任何功劳都应归功于他),它还考虑了null或空参数:

public static string UnCamelCaseIterative(string str)
{
    if (String.IsNullOrEmpty(str))
        return str;

    /* Note that the .ToString() is required, otherwise the char is implicitly
     * converted to an integer and the wrong overloaded ctor is used */
    StringBuilder sb = new StringBuilder(str[0].ToString());
    for (int i = 1; i < str.Length; i++)
    {
        if (char.IsUpper(str, i))
            sb.Append(" ");
        sb.Append(str[i]);
    }
    return sb.ToString();
}

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有