试图附加到Iterable [String]

时间:2013-05-27 12:46:14

标签: scala iterable

我正在尝试将另一个字符串添加到Iterable [String]以便于连接,但结果不是我所期望的。

scala> val s: Iterable[String] = "one string" :: "two string" :: Nil
s: Iterable[String] = List(one string, two string)

scala> s.mkString(";\n")
res3: String =
one string;
two string

scala> (s ++ "three").mkString(";\n")
res5: String =
one string;
two string;
t;
h;
r;
e;
e

我应该如何重写此片段以在我的iterable中包含3个字符串?

编辑:我应该补充一下,应该保留项目的顺序

3 个答案:

答案 0 :(得分:6)

++用于集合聚合。 +中没有方法:+addIterable,但您可以像这样使用方法++

scala> (s ++ Seq("three")).mkString(";\n")
res3: String =
one string;
two string;
three

答案 1 :(得分:4)

++函数正在等待Traversable参数。如果仅使用"three",它会将字符串"three"转换为字符列表,并将每个字符追加到s。这就是你得到这个结果的原因。

相反,您可以在Iterable中包装“three”,并且连接应该正常工作:

scala> (s ++ Iterable[String]("three")).mkString(";\n")
res6: String =
one string;
two string;
three

答案 2 :(得分:0)

我喜欢使用toBuffer然后使用+ =

scala> val l : Iterable[Int] = List(1,2,3)
l: Iterable[Int] = List(1, 2, 3)

scala> val e : Iterable[Int] = l.toBuffer += 4
e: Iterable[Int] = ArrayBuffer(1, 2, 3, 4)

或在您的示例中:

scala> (s.toBuffer += "three").mkString("\n")

我不知道为什么标准库不支持此操作。你也可以使用toArray但是如果你添加了多个元素,那么性能就会降低 - 我会假设 - 因为如果添加了另一个元素,缓冲区应该返回它自己。