单个列表中的字符串连接

时间:2011-09-13 02:09:30

标签: list scala concatenation

Scala对我来说是新手,所以我不确定最好的方法。

我需要简单地将字符串放在一个列表中并加入它们。 因此,concat(List("a","b","c"))会返回abc

我应该先看看列表中有多少个字符串,这样我可以循环并加入它们吗?我觉得首先需要这样做,这样你可以像使用数组一样使用列表并list[1]追加list[2]追加list[3]等等。

修改

这是我的想法,当然还有编译错误..

def concat(l: List[String]): String = {
var len = l.length
var i = 0
    while (i < len) {
        val result = result :: l(i) + " "
    }
result
}

6 个答案:

答案 0 :(得分:30)

在REPL

上如何做到这一点
List("a","b","c") mkString("")

或在脚本文件

List("a","b","c").mkString("")

答案 1 :(得分:2)

为您探索的一些选项:

  1. 命令:for-loop;使用List对象中的方法来确定 循环长度或用于每个列表项
  2. 经典功能:递归函数,使用
  3. 时的一个元素
  4. 高阶函数:看看折叠。
  5. 鉴于问题的基本水平,我认为你正在研究在编程中学习一些基础知识。如果选择的语言是Scala,可能重点是函数式编程,所以我会努力解决#2,然后解决#1。额外学分#3。

答案 2 :(得分:1)

本练习旨在鼓励您从功能角度思考问题。您有一组要移动的数据,执行一组相同的操作。您已经确定了命令式循环结构(for)。很简单。现在,您如何将其构建为功能构造,而不是依赖于“有状态”循环?

答案 3 :(得分:0)

  

在函数式编程中,fold ...是一个高阶族   在数据结构中迭代任意函数的函数   一些订单并建立一个返回值。

http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29

这听起来像你可以使用的东西。

由于字符串连接是关联的(确切地说,它形成一个将空字符串作为中性元素的幺半群),折叠的“方向”无关紧要(至少如果你没有受到性能的影响)。

说到性能:在现实生活中,使用StringBuilder作为中间步骤是个好主意,但如果你想使用它,这取决于你。

答案 4 :(得分:0)

我只是在这里假设你不仅是Scala的新手,而且还是一般的编程新手。我不是说SO不是为新手制作的,但我相信还有很多其他的地方,更适合你的需要。例如书籍......

我还假设您的问题不必以功能性,命令式或其他方式解决。它只需要作为家庭作业来解决。

以下是您应该考虑/问自己的事项列表:

  • 如果你想连接列表的所有元素,你真的需要知道有多少吗?
  • 如果您认为自己这样做,那很好,但是在使用这种方法解决了这个问题之后,请尝试解决一下您的解决方案,以确定是否有其他方法。
  • 将元素附加到结果列表是一个正确的思路,但想一想:除了面向对象之外,Scala也是一个功能齐全的函数式语言。你可能不知道这意味着什么,但你现在需要知道的是:它对列表之类的东西非常好(LISP是最着名的功能语言,它代表LISt Processing,它必须是某种,你不觉得吗?;))。所以也许有一些神奇的(甚至可能是Scala习惯用法)方法来完成这样的连接而不用自己定义结果列表。

答案 5 :(得分:0)

比mkString长一点但效率更高:

s.foldLeft(new StringBuilder())(_ append _)。toString()