中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Scala腳本的示例分析

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

成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

處理瑣碎的,每日工作的腳本經(jīng)常需要處理文件。本節(jié)中,你將建立一個(gè)從文件中讀入行記錄,并把行中字符個(gè)數(shù)前置到每一行,打印輸出的腳本。***版展示在代碼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的類。然后檢查是否命令行里定義了至少一個(gè)參數(shù)。若是,則***個(gè)參數(shù)被解釋為要打開和處理的文件名。表達(dá)式Source.fromFile(args(0)),嘗試打開指定的文件并返回一個(gè)Source對象,你在其上調(diào)用getLines。函數(shù)返回Iterator[String],在每個(gè)枚舉里提供一行包括行結(jié)束符的信息。for表達(dá)式枚舉這些行并打印每行的長度,空格和這行記錄。如果命令行里沒有提供參數(shù),***的else子句將在標(biāo)準(zhǔn)錯(cuò)誤流中打印一條信息。如果你把這些代碼放在文件contchars1.scala,并運(yùn)行它調(diào)用自己:

$ 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")

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

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")

想要達(dá)到這一點(diǎn),你可以對所有行枚舉兩次。***次決定每行字符計(jì)數(shù)的***寬度。第二次打印輸出之前計(jì)算的***寬度。因?yàn)橐杜e兩次,你***把它們賦給變量:

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

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

下一步,因?yàn)橐獙γ啃凶址麛?shù)計(jì)算兩次,每個(gè)枚舉計(jì)算一次,你或許會考慮把表達(dá)式拉出來變成一個(gè)小函數(shù),專門用來計(jì)算傳入字串的字符長度:

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

有了這個(gè)函數(shù),你就可以計(jì)算***長度了:

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

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

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

reduceLeft方法把傳入的方法應(yīng)用于lines的前兩個(gè)元素,然后再應(yīng)用于***次應(yīng)用的結(jié)果和lines接下去的一個(gè)元素,等等,直至整個(gè)列表。每次這樣的應(yīng)用,結(jié)果將是碰到的最長一行,因?yàn)閭魅氲暮瘮?shù),(a, b) => if (a.length > b.length) a else b,返回兩個(gè)傳入字串的最長那個(gè)。reduceLeft將傳回***一次應(yīng)用的結(jié)果,也就是本例lines中包含的最長字串。

得到這個(gè)結(jié)果之后,你可以通過把最長一行傳給widthOfLength計(jì)算***的寬度:

val maxWidth = widthOfLength(longestLine)

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

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

在這個(gè)for表達(dá)式里,你再一次枚舉了全部行記錄。對于每一行,首先計(jì)算行長度前所需的空格并把它賦給numSpaces。然后用表達(dá)式:" " * numSpaces創(chuàng)建包含numSpaces個(gè)空格的字串。最終,你打印出你想要格式的信息。全部的腳本展示在代碼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 對文件的每行記錄打印格式化的字符數(shù)量。

以上是“Scala腳本的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

當(dāng)前名稱:Scala腳本的示例分析
本文URL:http://www.rwnh.cn/article44/gspjee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)微信小程序、電子商務(wù)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
鹤峰县| 四川省| 永丰县| 龙泉市| 汉阴县| 玉门市| 拜城县| 英山县| 齐齐哈尔市| 株洲市| 钟山县| 静安区| 芦山县| 杨浦区| 德惠市| 南充市| 十堰市| 澄城县| 湖北省| 樟树市| 平遥县| 临夏市| 新巴尔虎左旗| 海林市| 潞西市| 无棣县| 临高县| 阳西县| 青田县| 太原市| 濉溪县| 太和县| 濮阳市| 大厂| 马龙县| 正阳县| 淮南市| 泸西县| 尉氏县| 柘城县| 屏东市|