4

我正在尝试向 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

我应该如何重写这个片段以在我的迭代中有 3 个字符串?

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

4

3 回答 3

8

++用于集合聚合。没有 method或in +,但您可以使用这样的方法::+addIterable++

scala> (s ++ Seq("three")).mkString(";\n")
res3: String =
one string;
two string;
three
于 2013-05-27T12:58:09.293 回答
5

++函数正在等待Traversable参数。如果您使用 just "three",它会将 String 转换"three"为字符列表并将每个字符附加到s. 这就是为什么你会得到这个结果。

相反,您可以将“三个”包装在 an 中Iterable,并且串联应该可以正常工作:

scala> (s ++ Iterable[String]("three")).mkString(";\n")
res6: String =
one string;
two string;
three
于 2013-05-27T12:57:43.087 回答
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 但如果添加多个元素,这将降低性能 - 我会假设 - 因为如果添加了另一个元素,缓冲区应该返回自身。

于 2016-11-11T14:49:40.020 回答