1. 程式人生 > >Scala學習筆記(二)--陣列、列表、元祖和scala指令碼編寫及讀取檔案

Scala學習筆記(二)--陣列、列表、元祖和scala指令碼編寫及讀取檔案

使用型別引數化陣列(Array)

在scala中使用new例項化物件(或者叫類例項)。例項化過程中,可以用值和型別使物件引數化。引數化的意思是指在建立例項的同時完成對它的“設定”。

例如,

val greeting:Array[String] = new Array[String](3)
greeting(0) = “Hello”
greeting(1) = “ ”
greeting(2) = “World”
greeting.foreach((word:String) => print(word))

其中,型別引數是[String],值引數是(3),因此其初始長度為3.

注意,當同時用型別和值引數化例項的時候,應該先寫方括號和型別引數,然後再寫圓括號和值引數。

陣列是scala中的一種類。用括號傳遞給變數一個或多個值時,scala會呼叫apply方法。

greeting(0) 等價 greeting.apply(0)

與之類似的還有update方法。

greeting(0) = “Hello”等價greeting.update (0,“Hello”)

使用列表list

Array[String](3)雖然長度和型別不可變,但是其元素可變。而list一旦建立就不可變。

列表最常見的操作符是“::”。它可以把新元素新增到現有列表的最前端,然後返回作為執行結果的新列表。

val twoThree:List[Int] = List(2,3)
val oneTwoThree =1::twoThree
println(oneTwoThree)

而使用操作符“:::”,可以將兩個列表拼接在一起組成一個新的list。

Tips:

注意到,valoneTwoThree = 1::twoThree,“::”是右運算元的方法。凡是以“:”為結尾的方法都是被右運算元呼叫。上式可以寫成,twoThree.::(1)。通常情況下,方法都是被左運算元呼叫。例如a+b,可以寫成a.+(b)。

為什麼列表不支援新增(append)操作?

List類沒有提供類似python中append操作,因為隨之列表的變長,append的耗時將呈線性增長,而使用::做字首僅消耗固定的時間。

使用元祖(Tuple)

與列表一樣,元祖也是不可變的;但與列表不同,元祖可以包含不同型別的元素。

元祖例項化後可以用點號、下劃線和基於1的索引訪問其中的元素。

元祖的實際型別取決於它含有的元素數量和這些元素的型別。

val pair: Tuple2(Int,String)= Tuple2(1,”Scala”)
println(pair._1)
println(pair._2)

Tips

訪問元祖的元素

為什麼元祖不能像列表一樣用Tuple.(i)來訪問元素?那是因為列表的apply方法始終返回同一型別的元素,但元祖中的元素的型別不盡相同。另外元祖的元素訪問是基於1的不是基於0。這是因為對於靜態型別的元祖的其他語言,從1開始是傳統的設定。

編寫指令碼和讀取檔案

Scala指令碼的命令列引數儲存在args的scala陣列中。

下例中,表示式Source.Source.fromFile(args(0))嘗試開啟指定檔案並返回Source物件。之後呼叫getLines返回Iterator[String]。迭代器每次返回一行文字,包括行結束符。

指令碼名test.scala

命令:scala test.scala test.scala

importscala.io.Source
defwidthOfLength(s: String) = s.length.toString.length
if(args.length>0){
      val lines =Source.fromFile(args(0)).getLines.toList
      val longestLine = lines.reduceLeft{
      (a,b)=>if(a.length>b.length) a elseb
      }
      val maxWidth = widthOfLength(longestLine)
      for(line<-lines){
            val numSpaces = maxWidth -widthOfLength(line)
            val padding = ""*numSpaces
            println(padding+line.length+"|"+line)
      }
}
else{
      Console.err.println("Please inputfile'names")
}