成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習Scala腳本:從文件里讀取行記錄

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第二章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

處理瑣碎的,每日工作的腳本經常需要處理文件。本節中,你將建立一個從文件中讀入行記錄,并把行中字符個數前置到每一行,打印輸出的腳本。***版展示在代碼3.10中:

51CTO編輯推薦:Scala編程語言專題

  1. import scala.io.Source  
  2.  
  3. if (args.length > 0) {  
  4.  
  5.  for (line <- Source.fromFile(args(0)).getLines)  
  6.   print(line.length + " " + line)  
  7. }  
  8. else  
  9.  Console.err.println("Please enter filename")  

代碼 3.10 從文件中讀入行

此腳本開始于從包scala.io引用名為Source的類。然后檢查是否命令行里定義了至少一個參數。若是,則***個參數被解釋為要打開和處理的文件名。表達式Source.fromFile(args(0)),嘗試打開指定的文件并返回一個Source對象,你在其上調用getLines。函數返回Iterator[String],在每個枚舉里提供一行包括行結束符的信息。for表達式枚舉這些行并打印每行的長度,空格和這行記錄。如果命令行里沒有提供參數,***的else子句將在標準錯誤流中打印一條信息。如果你把這些代碼放在文件contchars1.scala,并運行它調用自己:

  1. $ scala countchars1.scala countchars1.scala 

你會看到:

  1. 23 import scala.io.Source  
  2. 1  
  3. 23 if (args.length > 0) {  
  4. 1  
  5. 50   for (line <- Source.fromFile(args(0)).getLines)  
  6. 36     print(line.length + " " + line)  
  7. 2 }  
  8. 5 else  
  9. 47 Console.err.println("Please enter filename")  

盡管當前形式的腳本打印出了所需的信息,你或許希望能讓數字右序排列,并加上管道符號,這樣輸出看上去就替換成:

  1. 23 | import scala.io.Source  
  2.  1 |  
  3. 23 | if (args.length > 0) {  
  4.  1 |  
  5. 50 |   for (line <- Source.fromFile(args(0)).getLines)  
  6. 36 |     print(line.length + " " + line)  
  7.  2 | }  
  8.  5 | else  
  9. 47 |   Console.err.println("Please enter filename")  

想要達到這一點,你可以對所有行枚舉兩次。***次決定每行字符計數的***寬度。第二次打印輸出之前計算的***寬度。因為要枚舉兩次,你***把它們賦給變量:

  1. val lines = Source.fromFile(args(0)).getLines.toList 

***的toList是必須加的,因為getLines方法返回的是枚舉器。一旦你使用它完成遍歷,枚舉器就失效了。而通過調用toList把它轉換為List,你就可以枚舉任意次數,代價就是把文件中的所有行一次性貯存在內存里。lines變量因此就指向著包含了命令行指定的文件文本字串的數組。

下一步,因為要對每行字符數計算兩次,每個枚舉計算一次,你或許會考慮把表達式拉出來變成一個小函數,專門用來計算傳入字串的字符長度:

  1. def widthOfLength(s: String) = s.length.toString.length 

有了這個函數,你就可以計算***長度了:

  1. var maxWidth = 0 
  2. for (line <- lines)  
  3.  maxWidthmaxWidth = maxWidth.max(widthOfLength(line)) 

這里你用一個for表達式枚舉了每一行,計算這些行的寬度,并且,如果比當前***寬度還大,就把它賦值給maxWidth,一個初始化為0的var。(max方法是你可以在任何Int上調用的,可以返回被調用者和被傳入者中的較大的值。)如果你希望不用var發現***值,替代的方法是可以首先找到最長的一行,如:

  1. val longestLine = lines.reduceLeft(  
  2.  (a, b) => if (a.length > b.length) a else b  
  3. )  
  4.  
  5. val widths = lines.map(widthOfLength)  

reduceLeft方法把傳入的方法應用于lines的前兩個元素,然后再應用于***次應用的結果和lines接下去的一個元素,等等,直至整個列表。每次這樣的應用,結果將是碰到的最長一行,因為傳入的函數,(a, b) => if (a.length > b.length) a else b,返回兩個傳入字串的最長那個。reduceLeft將傳回***一次應用的結果,也就是本例lines中包含的最長字串。

得到這個結果之后,你可以通過把最長一行傳給widthOfLength計算***的寬度:

  1. val maxWidth = widthOfLength(longestLine) 

***剩下的就是用一個合適的格式把這些行打印出來。你可以這么做:

  1. for (line <- lines) {  
  2.  val numSpaces = maxWidth - widthOfLength(line)  
  3.  val padding = " " * numSpaces  
  4.  print(padding + line.length + " | " + line)  

在這個for表達式里,你再一次枚舉了全部行記錄。對于每一行,首先計算行長度前所需的空格并把它賦給numSpaces。然后用表達式:" " * numSpaces創建包含numSpaces個空格的字串。最終,你打印出你想要格式的信息。全部的腳本展示在代碼3.11中:

  1. import scala.io.Source  
  2. def widthOfLength(s: String) = s.length.toString.length  
  3. if (args.length > 0) {  
  4.  val lines = Source.fromFile(args(0)).getLines.toList  
  5.  val longestLine = lines.reduceLeft(  
  6.   (a, b) => if (a.length > b.length) a else b  
  7.  )  
  8.  val maxWidth = widthOfLength(longestLine)  
  9.  for (line <- lines) {  
  10.   val numSpaces = maxWidth widthOfLength(line)  
  11.   val padding = " " * numSpaces  
  12.   print(padding + line.length +" | "+ line)  
  13.  }  
  14. }  
  15. else  
  16.  Console.err.println("Please enter filename")  

代碼 3.11 對文件的每行記錄打印格式化的字符數量。

本文節選自《Programming in Scala》

【相關閱讀】

  1. 學習識別Scala的函數式風格
  2. Scala編程實例:使用Set和Map
  3. Scala編程實例:使用List和Tuple
  4. Scala編程實例:帶類型的參數化數組
  5. 初探Scala編程:編寫腳本,循環與枚舉
責任編輯:yangsai 來源: Artima
相關推薦

2009-09-28 11:01:39

從Java走進Scal

2009-08-21 16:17:25

ScalaTwitter API

2009-06-17 11:44:22

Scala控制結構

2020-01-10 22:56:56

Python圖像處理Linux

2009-12-09 09:15:47

從Java走進ScalTwitter API

2009-07-15 10:14:25

Scala并發性

2009-02-04 17:32:03

ibmdwJavaScala

2009-06-16 17:54:38

Scala類語法語義

2009-11-16 17:04:46

Inside Scal

2021-08-20 10:46:25

Shell腳本文件Linux

2021-04-21 08:03:34

腳本Shell讀取

2009-07-22 07:43:00

Scala閉包

2009-07-22 07:47:00

Scala客戶代碼

2009-07-21 16:58:31

Scala變量范圍

2009-06-11 17:39:55

xmljava

2009-07-08 17:40:28

ScalaScala腳本

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數

2009-07-22 09:02:45

Scala組合繼承

2009-10-14 11:14:38

ScitterScalaTwitter
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品乱码久久久久久按摩 | 国产精品69久久久久水密桃 | 国产yw851.c免费观看网站 | 国产中文在线 | 亚洲国产成人精品女人久久久 | 91亚洲国产亚洲国产 | 天天曰夜夜操 | 亚洲一区二区三区视频 | 国产91综合| 最新国产福利在线 | 久草电影网 | 亚洲国产精品久久久 | 国产999精品久久久久久 | 亚洲三区在线观看 | 久久国色 | 久久亚洲欧美日韩精品专区 | 成人免费网站在线 | 91视频正在播放 | 国产精品成人一区二区三区 | 亚洲精品一区中文字幕 | www.久久99| 男女网站免费观看 | 国产精品亚洲一区二区三区在线 | www精品| 懂色中文一区二区三区在线视频 | 成人不卡视频 | 精品久久久久久久久久久院品网 | 国产重口老太伦 | 久久久久久久久久一区 | 亚洲一区二区在线 | 国产精品美女在线观看 | 免费精品| 亚洲第一天堂 | 日韩视频在线一区 | 亚洲精品久久久蜜桃网站 | 天天弄天天操 | 国产精品v | 欧美综合一区 | 国产精品不卡视频 | 99亚洲视频 | 91视频电影|