0

当我们需要连接一个字符串数组时,我们可以使用 mkString 方法:

val concatenatedString = listOfString.mkString

但是,当我们有一个很长的字符串列表时,连接字符串可能不是一个好的选择。在这种情况下,直接打印到输出会更合适,将其写入输出流很简单:

listOfString.foreach(outstream.write _)

但是,我不知道附加分隔符的巧妙方法。我尝试过的一件事是使用索引循环:

var i = 0
for(str <- listOfString) {
  if(i != 0) outstream.write ", "
  outstream.write str
  i += 1
}

这行得通,但它太罗嗦了。虽然我可以让一个函数封装上面的代码,但我想知道 Scala API 是否已经有一个函数做同样的事情。

谢谢你。

4

5 回答 5

4

这是一个以更优雅的方式执行您想要的功能的函数:

def commaSeparated(list: List[String]): Unit = list match {
    case List() => 
    case List(a) => print(a)
    case h::t => print(h + ", ")
                 commaSeparated(t)
}

递归避免了可变变量。

为了使其更具功能性风格,您可以传入要在每个项目上使用的功能,即:

def commaSeparated(list: List[String], func: String=>Unit): Unit = list match {
    case List() => 
    case List(a) => func(a)
    case h::t => func(h + ", ")
                 commaSeparated(t, func)
}

然后通过以下方式调用它:

commaSeparated(mylist, oustream.write _)
于 2012-12-03T06:21:01.960 回答
2

我相信你想要的是mkString.

的定义mkString

scala> val strList = List("hello", "world", "this", "is", "bob")
strList: List[String] = List(hello, world, this, is, bob)

def mkString: String

scala> strList.mkString
res0: String = helloworldthisisbob

def mkString(sep: String): String

scala> strList.mkString(", ")
res1: String = hello, world, this, is, bob  

def mkString(start: String, sep: String, end: String): String

scala> strList.mkString("START", ", ", "END")
res2: String = STARThello, world, this, is, bobEND

编辑 这个怎么样?

scala> strList.view.map(_ + ", ").foreach(print) // or .iterator.map
hello, world, this, is, bob,
于 2012-12-03T05:47:11.940 回答
2

不适合并行化代码,但除此之外:

val it = listOfString.iterator
it.foreach{x => print(x); if (it.hasNext) print(' ')}
于 2012-12-03T15:01:26.337 回答
1

自我回答

我写了一个函数封装了原问题中的代码:

implicit def withSeparator[S >: String](seq: Seq[S]) = new {
  def withSeparator(write: S => Any, sep: String = ",") = {
    var i = 0
    for (str <- seq) {
      if (i != 0) write(sep)
      write(str)
      i += 1
    }
    seq
  }
}

你可以像这样使用它:

listOfString.withSeparator(print _)

也可以分配分隔符:

listOfString.withSeparator(print _, ",\n")

谢谢大家回答我。我想使用的是简洁且不太慢的表示。withSeparator 的隐式函数看起来像我想要的东西。所以我接受我自己对这个问题的回答。再次感谢你。

于 2012-12-03T06:37:18.697 回答
1

这是另一种避免 var 的方法

listOfString.zipWithIndex.foreach{ case (s, i) =>
    if (i != 0) outstream write ","
    outstream write s }
于 2012-12-03T19:48:44.857 回答