所以我有以下内容:
val bufferedSource = io.Source.fromFile("""C:\Users\something\workspace\""" + fileName)
val lines = bufferedSource.getLines
我想随机选择一个起始索引和一个结束索引,并在打印到新文件时在此范围内迭代lines
。有没有办法按索引访问lines
迭代器中的元素?
我的第一次尝试是将数据复制到ListBuffer
:
var lineArr = ListBuffer[String]()
for (line <- lines) {
lineArr += line
}
Therafter如果我按照索引在我的范围内迭代lineArr
,那么它真的很慢。
我能以什么方式有效地做到这一点?
旁注:如果我遍历lines
包含所有元素(我不想要),那么在将它们写入新文件时迭代很快,但我只想要一个选择的数量来写。
答案 0 :(得分:2)
因此,我没有遍历每一行,而是使用切片解决了这个问题。我仍然创建一个ListBuffer
但我在开始和结束索引上切片:
lineArrTemp = lineArrTemp.slice(start, end)
此后只需遍历ListBuffer
迭代器,效率很高。
答案 1 :(得分:1)
lines
.drop(startIndex)
.take(endIndex - startIndex)
.foreach(writeToFile)
答案 2 :(得分:0)
在迭代器上也考虑zipWithIndex
,因此我们可以根据索引值来完善行选择;例如,选择带有
io.Source.fromFile("temp.txt").getLines.zipWithIndex.foreach {
case (line,i) => if (i % 2 == 0) println(line)
}
这里我们一次索引一行,因为我们只迭代文件一次。