给定Iterator[String]
,使用mkString创建csv String
很容易:
//Result: "1,2,3,4,5"
Iterator("1","2","3","4","5").mkString(",")
mkString的问题在于它会消耗内存来保存整个结果字符串。
是否可以将转换应用于原始迭代器,该转换器提供与mkString相同的输出但不会将内存与整个结果联系起来?
val csvIter : Iterator[String] = doSomething(Iterator("1","2","3","4","5"))
出于测试目的,以下表达式应返回true:
val originalIter : Iterator[String] = ???
originalIter.mkString(",") == doSomething(originalIter).reduceOption(_ + _).getOrElse("")
提前感谢您的考虑和回应。
答案 0 :(得分:1)
这是一个在处理所有其他元素之前处理第一个元素的解决方案:
def mkString(it: Iterator[String]) = if (it.hasNext)
Iterator(it.next()) ++ it.map("," + _)
else it
答案 1 :(得分:1)
不知道这对你是否重要,但这会将分隔符交错为不同的元素:
def mkString(iter: Iterator[String], sep: String) = new Iterator[String] {
var nextIsSep = false
def hasNext: Boolean = iter.hasNext
def next(): String = {
val result = if (nextIsSep) sep else iter.next()
nextIsSep = !nextIsSep
result
}
}