亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Scala腳本的示例分析

發布時間:2021-11-30 15:57:30 來源:億速云 閱讀:187 作者:小新 欄目:編程語言

小編給大家分享一下Scala腳本的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

import scala.io.Source   if (args.length > 0) {    for (line <- Source.fromFile(args(0)).getLines)    print(line.length + " " + line)  }  else   Console.err.println("Please enter filename")

代碼 3.10 從文件中讀入行

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

$ scala countchars1.scala countchars1.scala

你會看到:

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

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

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

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

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

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

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

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

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

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

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

val longestLine = lines.reduceLeft(   (a, b) => if (a.length > b.length) a else b  )   val widths = lines.map(widthOfLength)

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

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

val maxWidth = widthOfLength(longestLine)

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

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

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

import scala.io.Source  def widthOfLength(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 else b   )   val maxWidth = widthOfLength(longestLine)   for (line <- lines) {    val numSpaces = maxWidth widthOfLength(line)    val padding = " " * numSpaces    print(padding + line.length +" | "+ line)   }  }  else   Console.err.println("Please enter filename")

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

以上是“Scala腳本的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

故城县| 石城县| 邵东县| 缙云县| 吉木乃县| 昭通市| 泰安市| 舒兰市| 九龙县| 邢台市| 汉寿县| 曲靖市| 邵武市| 广安市| 出国| 阜南县| 资中县| 黔西| 尼勒克县| 绥中县| 凤城市| 巴林右旗| 洪洞县| 安图县| 伊通| 石泉县| 昌宁县| 县级市| 彭州市| 界首市| 苗栗县| 西乡县| 肥城市| 于田县| 绵阳市| 繁峙县| 宜宾市| 呼伦贝尔市| 镇雄县| 佳木斯市| 含山县|