class test{
import io.Source
import scala.util._
val pathname = "XXXYYY.csv"
val open = Source.fromFile(pathname).getLines
def addelements(list: List[String]) : List[String] = {
def addElementsRecursion(list: List[String]) : List[String] = {
while(open.hasNext){
val tmpVal = open.next()
val newList = list: tmpVal
addElementsRecursion(newList)
}
println(list)
list
}
addElementsRecursion(list)
}
}
val obj = new test()
val list1 = List()
obj.addelements(list1)
輸出是:
List(?1, 2)
List(?1)
List()
csv 檔案只是其中包含數字 1 和 2 的檔案,程式的目標是遍歷該檔案,然后將檔案中的數字輸出到串列中。
我的問題是,程式在 while 回圈后第一次到達 list 陳述句時是否應該停止,因此最終結果應該是 List(1,2)。由于某種原因,即使沒有再次呼叫遞回函式,串列值也會在最后發生變化。
uj5u.com熱心網友回復:
addelements只回傳你給它的值,因為addElementsRecursion只回傳你給它的值。有一個while,println但這些都沒有改變的值,list所以它被原封不動地回傳。事實上,它們無法更改,list因為它是val對不可變物件的參考。
不完全清楚為什么這段代碼同時使用while和遞回呼叫;對于這個邏輯,遞回呼叫應該足夠了。也許是這樣的:
def addelements(list: List[String]) : List[String] = {
def addElementsRecursion(list: List[String]) : List[String] =
if (open.hasNext) {
addElementsRecursion(open.next() : list)
} else {
list.reverse
}
addElementsRecursion(list)
}
此代碼添加到串列的前面,然后在末尾反轉結果,因為將元素添加到串列的前面比將其添加到末尾更有效,尤其是對于長串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/405123.html
標籤:
