我有以下代码片段:代码读取系统(Linux)字典(en)文件并将其保存在内存列表中。
代码1 :(使用可变列表)
val word = scala.collection.mutable.LinkedList[String]("init");
for(line <- Source.fromFile("/usr/share/dict/words").getLines()){
val s : String = line.trim()
if( // some checks
){
word append scala.collection.mutable.LinkedList[String](s)
}
}
代码2 :(使用不可变列表)
var word = List[String]()
for(line <- Source.fromFile("/usr/share/dict/words").getLines()){
val s : String = line.trim()
if( // some checks
){
word ::= s
}
}
代码2:几乎立即返回,但是 代码1:永远需要。
任何人都可以帮助我,为什么要花这么多时间来制作可变的List? 。我们应该使用Mutable吗?还是我做错了什么?
使用的Scala版本:2.10.3
先谢谢你的帮助。
答案 0 :(得分:1)
word append scala.collection.mutable.LinkedList[String](s)
遍历word
列表,然后在最后添加其他列表中的项目。
word ::= s
在单词列表的前面附加s
,并将新列表分配给单词变量。
与在前面添加项目相比,追加到列表末尾总是很昂贵。
答案 1 :(得分:1)
在第一个示例中,您将重复添加到列表的末尾(追加)。这需要时间按照列表的长度顺序。在第二个示例中,您将添加到列表的开头(::)。这需要恒定的时间。因此,第一个示例的执行时间随着文件中行数的平方而增加,第二个示例的执行时间随着文件的长度线性增加。
这是由于链表的性质,链表是不可变List
和可变LinkedList
的数据结构。链接列表在前面快速访问,在后面访问速度慢。