4

我想知道以下代码段的效率是多少:

val lst = Source.fromFile(f).getLines.toList

发行时lst.contains(x)

这是否意味着f正在重新扫描,还是搜索依赖于f新创建列表中的内存内容?

提前致谢。

4

2 回答 2

4

搜索依赖于内存中的内容。并且它只加载一次toList被调用。

如何更好地直接从源头上看。 Source.fromFile返回一个scala.io.BufferedSourcegetLines返回一个BufferedLineIterator

它在 BufferedLineIterator 中,读取文件的内容。

override def hasNext = {
  if (nextLine == null)
    nextLine = lineReader.readLine

  nextLine != null
}
override def next(): String = {
  val result = {
    if (nextLine == null) lineReader.readLine
    else try nextLine finally nextLine = null
  }
  if (result == null) Iterator.empty.next
  else result
}
}

调用toList使用nexthasNext以上来派生列表。所以lst已经包含了文件的所有元素。

Doinglst.contains(x)像任何其他列表一样遍历列表。

于 2013-07-30T06:34:25.073 回答
2

使用 toList 后,它将返回不可变列表给您进行操作。您的文件将不会重新扫描您在列表中执行的操作

于 2013-07-30T07:05:13.273 回答