首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于连接字符串数组的算法

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

Stack Overflow用户
提问于 2008-09-12 07:10:21
回答 15查看 7.4K关注 0票数 14

一段时间以来,我一直在想,连接字符串数组的解决方案会是什么样子。例如:我有"Alpha","Beta","Gamma“,并希望将字符串连接成一个字符串,用逗号分隔- "Alpha,Beta,Gamma”。

现在我知道大多数编程语言都为此提供了某种联接方法。我只是想知道这些是如何实现的。当我学习入门课程时,我经常尝试单独进行,但从未找到令人满意的算法。每件事看起来都相当混乱,问题是你不能只是循环数组,连接字符串,因为你会在最后一个字符串之前或之后添加多一个逗号。我不想在循环中检查条件。我真的不想在循环之前/之后添加第一个或最后一个字符串(我猜这可能是最好的方法?)。

有人能给我一个优雅的解决方案吗?或者告诉我为什么不能有更优雅的东西?

EN

回答 15

Stack Overflow用户

发布于 2008-09-12 07:15:44

对于这样的问题,我找到的最优雅的解决方案是这样的(用伪代码)

代码语言:javascript
复制
separator = ""
foreach(item in stringCollection)
{
    concatenatedString += separator + item
    separator = ","
}

您只需运行循环,并且仅在设置了分隔符的第二次之后。所以第一次它不会被添加。

票数 21
EN

Stack Overflow用户

发布于 2008-09-12 07:33:35

所有这些解决方案都是不错的,但对于底层库来说,分隔符的独立性和不错的速度都很重要。假设该语言具有某种形式的字符串构建器,下面是一个符合要求的函数。

代码语言:javascript
复制
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();
}

主要原因是因为任何时候调用c=a+b时,底层结构通常是c=(新的StringBuilder()).append(a).append(b).toString();.通过重用相同的字符串构建器对象,我们可以减少产生的分配和垃圾数量。

在有人说优化是邪恶的之前,我们讨论的是实现一个公共的库函数。可接受的、可伸缩的性能是它们的要求之一。一个需要很长时间的连接是不会经常使用的。

票数 10
EN

Stack Overflow用户

发布于 2008-09-12 08:39:51

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

作为对Mendelt Siebenga的响应,如果您确实需要手动解决方案,我会使用三元运算符,如下所示:

代码语言:javascript
复制
separator = ","
foreach (item in stringCollection)
{
    concatenatedString += concatenatedString ? separator + item : item
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档