knu*_*ton 13 language-agnostic arrays string algorithm
我想知道一段时间,加入一个字符串数组的一个漂亮,干净的解决方案可能看起来像.示例:我有["Alpha","Beta","Gamma"]并希望将字符串连接成一个,用逗号分隔 - "Alpha,Beta,Gamma".
现在我知道大多数编程语言为此提供了某种连接方法.我只是想知道这些是如何实现的.当我参加入门课程时,我经常尝试单独进行,但从未找到过令人满意的算法.一切似乎都很混乱,问题是你不能只是循环遍历数组,连接字符串,因为你会添加一个太多的逗号(在最后一个字符串之前或之后).我不想检查循环中的条件.我真的不想在循环之前/之后添加第一个或最后一个字符串(我猜这可能是最好的方法吗?).
有人能给我一个优雅的解决方案吗?或者告诉我为什么没有更优雅的东西呢?
Men*_*elt 19
我发现像这样的问题最优雅的解决方案是这样的(在伪代码中)
separator = ""
foreach(item in stringCollection)
{
concatenatedString += separator + item
separator = ","
}
Run Code Online (Sandbox Code Playgroud)
您只需在第二次设置分隔符后运行循环.所以第一次它不会被添加.它并不像我想的那样干净,所以我仍然会添加注释,但它比if语句或在循环外添加第一个或最后一个项目更好.
Pat*_*ick 10
所有这些解决方案都是不错的解决方案,但对于底层库,分离器的独立性和合适的速度都很重要.假设语言具有某种形式的字符串构建器,这是一个符合要求的函数.
public static string join(String[] strings, String sep) {
if(strings.length == 0) return "";
if(strings.length == 1) return strings[0];
StringBuilder sb = new StringBuilder();
sb.append(strings[0]);
for(int i = 1; i < strings.length; i++) {
sb.append(sep);
sb.append(strings[i]);
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我想我应该提一下为什么这会更快.主要原因是因为任何时候你打电话给c = a + b; 底层构造通常是c =(new StringBuilder()).append(a).append(b).toString();. 通过重用相同的字符串构建器对象,我们可以减少分配量和生成的垃圾.
在有人讨论优化之前是邪恶的,我们谈论的是实现一个通用的库函数.可接受的,可扩展的性能是它们的要求之一.需要很长时间的连接是一个不会被使用的连接.
现在大多数语言 - 例如perl(由Jon Ericson提及),php,javascript - 都有一个join()函数或方法,这是迄今为止最优雅的解决方案.更少的代码是更好的代码.
作为对Mendelt Siebenga的回应,如果你确实需要手动解决方案,我会选择三元运算符:
separator = ","
foreach (item in stringCollection)
{
concatenatedString += concatenatedString ? separator + item : item
}
Run Code Online (Sandbox Code Playgroud)