非常基础,我只是好奇其他人如何实现这个算法,并想看看是否有任何聪明的技巧来优化算法......我只是必须为我正在从事的项目实现这个。
给定一个 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)。您将如何实现?
最佳答案
我已经能感觉到火焰了,但我喜欢这种东西的正则表达式。
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 提出的问题 below (就像 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 对象的回复)针对正则表达式方法测试了迭代方法。请注意,结果不包括 Regex 的编译时间。对于 200 万次调用(使用相同的 FooBarGork 输入):
迭代: 00:00:00.80
正则表达式: 00:00:06.71
因此很明显迭代方法的效率多。我已经包含了一个固定版本的 OPs 实现(Jason Punyon 的 as suggested,任何功劳都应该归于他),它也考虑了 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();
}
关于algorithm - "spacify"CamelCased 字符串的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484085/