Scala:使用输出流时打印分隔符

时间:2012-12-03 05:34:51

标签: scala

当我们需要连接一个字符串数组时,我们可以使用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是否已经有一个函数做同样的事情。

谢谢。

5 个答案:

答案 0 :(得分: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 _)

答案 1 :(得分: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,

答案 2 :(得分:2)

不适合并行化代码,但不然:

val it = listOfString.iterator
it.foreach{x => print(x); if (it.hasNext) print(' ')}

答案 3 :(得分: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的隐式函数看起来像我想要的东西。所以我接受了我自己对这个问题的回答。再次感谢你。

答案 4 :(得分:1)

这是避免var

的另一种方法
listOfString.zipWithIndex.foreach{ case (s, i) =>
    if (i != 0) outstream write ","
    outstream write s }