用于连接例如字符串数组的算法

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语句或在循环外添加第一个或最后一个项目更好.

  • 在许多语言中,除非使用Stringbuilder,否则性能会很差. (2认同)

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();. 通过重用相同的字符串构建器对象,我们可以减少分配量和生成的垃圾.

在有人讨论优化之前是邪恶的,我们谈论的是实现一个通用的库函数.可接受的,可扩展的性能是它们的要求之一.需要很长时间的连接是一个不会被使用的连接.


Bob*_*ack 5

现在大多数语言 - 例如perl(由Jon Ericson提及),php,javascript - 都有一个join()函数或方法,这是迄今为止最优雅的解决方案.更少的代码是更好的代码.

作为对Mendelt Siebenga的回应,如果你确实需要手动解决方案,我会选择三元运算符:

separator = ","
foreach (item in stringCollection)
{
    concatenatedString += concatenatedString ? separator + item : item
}
Run Code Online (Sandbox Code Playgroud)

  • 使用"+"连接多个字符串始终是一个可能的性能食用者. (2认同)