试图附加到 Iterable[String]

Posted

技术标签:

【中文标题】试图附加到 Iterable[String]【英文标题】:Trying to append to Iterable[String] 【发布时间】:2013-05-22 07:57:16 【问题描述】:

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

我应该如何重写这个 sn-p 以在我的 iterable 中有 3 个字符串?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

FWIW 我们应该能够只做s + "three",但是由于+Predef.any2stringad 注入的无处不在的运算符,我们最终得到了字符串连接而不是附加.您通常会改用:++:,这将消除通话的歧义,但遗憾的是它们出现在Seq 而不是Iterable。这实际上是一致的,因为 + 也没有在 Iterable 上定义,但不幸的是,尝试在 Iterable 上使用 + 将导致预期结果(而不是附加到可迭代或不编译,这两者都会更好)【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

我喜欢用 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 但如果添加多个元素,则性能会降低 - 我会假设 - 因为如果添加了另一个元素,缓冲区应该返回自身。

【讨论】:

以上是关于试图附加到 Iterable[String]的主要内容,如果未能解决你的问题,请参考以下文章

试图在 Swift 中附加字典 [重复]

多线程--协程

如何将新精灵附加到移动精灵?

为啥Java中的String类没有实现Iterable?

Scala Option[String] map 变成 Iterable

廖雪峰python摘录4