Scala進階之路-高級數據類型之數組的使用


             Scala進階之路-高級數據類型之數組的使用

                               作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

 

 

一.數組的初始化方式

1>.長度不可變數組Array

  注意:顧名思義,長度不可變數組指的是數組的長度不可變,但是數組的內容是可以變換的!

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object MyArray {
 9 
10     def main(args: Array[String]): Unit = {
11         /**
12           * 定義一個固定長度的數組,長度可變,內容可變(因為變量我們是用var關鍵字修飾)。
13           * [String] :表示的是數組的泛型,即該數組只能接收String類型的數據喲
14           * (3) : 這個數字3表示的是arr數組的長度
15           */
16         var arr :Array[String] = new Array[String](3)
17         /**
18           * 當然,上面的那種方式是寫了arr變量的數據類型為一個數組,我們不懈也是可以的,因為Scala解釋器會默認幫我們隱式轉換的喲
19           */
20         var arr2 = new Array[String](3)
21 
22         /**
23           * 定義定長數組, 長度不可變, 內容可變(因為變量是由val關鍵字修飾)
24           */
25         val arr3 = Array (1,2,3)    //我們可以直接初始化數組的內容,這個時候就不需要new關鍵字啦!
26 
27         /**
28           * 接下來我們分別修改我們定義的3個數組中的內容,具體操作如下
29           */
30         arr(0) = "yinzhengjie"
31         arr2(1) = "尹正傑"
32         arr3(2) = 100
33 
34         //我們直接調用數組的toBuffer方法,因為該方法重寫了toString方法。
35         println(arr.toBuffer.toString())
36         println(arr2.toBuffer.toString())
37         println(arr3.toBuffer.toString())
38     }
39 }
40 
41 
42 
43 /*
44 以上代碼執行結果如下 :
45 ArrayBuffer(yinzhengjie, null, null)
46 ArrayBuffer(null, 尹正傑, null)
47 ArrayBuffer(1, 2, 100)
48  */

 2>.長度可變數組(ArrayBuffer)

  顧名思義,長度可變數組指的是數組的長度是可以變化的,其內容也是可以變化的喲!

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 /**
 9   *         有可變(mutable包下存放)和不可變(immutable包下存放)兩種類型,immutable 類型的集合初始化后就不能改變了,默認情況下使用的是
10   * 不可變數組,如果我們想要使用它可變類型數組類型ArrayBuffer,那么就需要導入這個包啦!
11   */
12 import scala.collection.mutable.ArrayBuffer
13 
14 
15 object ArrayBuffDemo {
16 
17     def main(args: Array[String]): Unit = {
18         //定義一個可變的數組
19         val arr = ArrayBuffer[String]("yinzhengjie","尹正傑","Scala")
20         //我們遍歷定義的數組
21         arr.foreach(i => print(i + "\t"))
22         println("\n==========我是分割線===========")
23         //我們往可變的數組內容中添加數據
24         arr+=("Shell","Python","Java","Golang")
25         //我們再次遍歷定義的數組
26         arr.foreach(i => print(i + "\t"))
27     }
28 }
29 
30 /*
31 以上代碼執行結果如下:
32 yinzhengjie    尹正傑    Scala
33 ==========我是分割線===========
34 yinzhengjie    尹正傑    Scala    Shell    Python    Java    Golang
35  */

 

二.數組的常用方法

1>.映射方法(map)

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object MyArray {
 9 
10     def main(args: Array[String]): Unit = {
11         /**
12           * 注意,如果直接給數組初始化的話,可以不用寫new,直接使用數組的apply方法進行賦值操作,當然你可以省略".apply"這個方法。
13           */
14         val arr = Array.apply[String]("yinzhengjie","尹正傑","Scala","Python","Golang")
15 
16         /**
17           * 定義映射關系f1,功能是將傳入的String類型的參數加上后綴;而arr數組經過map映射操作之后會返回一個新的數組。
18           */
19         var f1 = (x:String) => x + "_2018"
20         val arr2 = arr.map(f1)
21 
22         /**
23           * 當然,上面的這種寫法也可以簡寫,如下:
24           */
25         val arr3 = arr.map((x:String) => x + "_2018")   //我們可以把上面的f1映射名稱去掉,直接傳入一個匿名函數
26         val arr4 = arr.map(x => x + "_2018")            //這里的x的變量Scala會自動識別其數據類型
27         var arr5 = arr.map(_ + "_2018")                 //注意這個下划線("_")其實是表示的是arr數組中的每一個元素喲
28 
29         println(arr.toBuffer.toString())
30         println(arr2.toBuffer.toString())
31         println(arr3.toBuffer.toString())
32         println(arr4.toBuffer.toString())
33         println(arr5.toBuffer.toString())
34     }
35 }
36 
37 
38 
39 /*
40 以上代碼執行結果如下 :
41 ArrayBuffer(yinzhengjie, 尹正傑, Scala, Python, Golang)
42 ArrayBuffer(yinzhengjie_2018, 尹正傑_2018, Scala_2018, Python_2018, Golang_2018)
43 ArrayBuffer(yinzhengjie_2018, 尹正傑_2018, Scala_2018, Python_2018, Golang_2018)
44 ArrayBuffer(yinzhengjie_2018, 尹正傑_2018, Scala_2018, Python_2018, Golang_2018)
45 ArrayBuffer(yinzhengjie_2018, 尹正傑_2018, Scala_2018, Python_2018, Golang_2018)
46  */

2>.扁平化操作(flatten與flatMap

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object MyArray {
 9 
10     def main(args: Array[String]): Unit = {
11         /**
12           * 定義一個數組,里面存放兩個字符串
13           */
14         val arr = Array.apply[String]("yinzhengjie,尹正傑","Python,Shell,Golang,Java,Scala")
15         /**
16           *     我們使用映射方法map將里面的每個元素用逗號(",")進行切割,最終會將arr里面的兩個字符串變成了2個數組,
17           * 而這兩個數組中存放的是每個字符串按照“,”切割后的數組。
18           */
19         val arr2 = arr.map(_.split(","))
20 
21         /**
22           * 接下來我們調用扁平化操作,使用flatten方法將兩個arr2里面的兩個數組去掉,直接把arr2里面嵌套的數組的每一個元素取出來。
23           */
24         val arr3 = arr2.flatten
25 
26 
27         /**
28           * 如果你覺得由arr轉換到arr3步驟過於繁瑣,你可以這樣寫,“arr3 = arr.map(_.split(",")).flatten”,當然你也可以使用flatMap方法喲!
29           */
30         val arr4 = arr.flatMap(_.split(","))
31 
32         /**
33           * 我們可以查看arr,arr2以及arr3的數組的內容以及長度。
34           */
35         println(arr.toBuffer.toString(),arr.length)
36         println(arr2(0).toBuffer.toString(),arr2(1).toBuffer.toString(),arr2.length)
37         println(arr3.toBuffer.toString(),arr3.length)
38         println(arr4.toBuffer.toString(),arr4.length)
39     }
40 }
41 
42 
43 /*
44 以上代碼執行結果如下 :
45 (ArrayBuffer(yinzhengjie,尹正傑, Python,Shell,Golang,Java,Scala),2)
46 (ArrayBuffer(yinzhengjie, 尹正傑),ArrayBuffer(Python, Shell, Golang, Java, Scala),2)
47 (ArrayBuffer(yinzhengjie, 尹正傑, Python, Shell, Golang, Java, Scala),7)
48 (ArrayBuffer(yinzhengjie, 尹正傑, Python, Shell, Golang, Java, Scala),7)
49  */

3>.遍歷方法(foreach)

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object MyArray {
 9 
10     def main(args: Array[String]): Unit = {
11         /**
12           * 定義一個數組,里面存放兩個字符串
13           */
14         val arr = Array.apply[String]("yinzhengjie,尹正傑","Python,Shell,Golang,Java,Scala")
15 
16         /**
17           * 使用flatMap將arr數組中的數據扁平化
18           */
19         val arr2 = arr.flatMap(_.split(","))
20 
21         /**
22           * 這個時候我們就可以用foreach方法遍歷arr2數組中里面的每一個元素,foreach方法需要傳遞一個返回空值的方法。首先我們會想到打印的方法
23           */
24         arr2.foreach(x => print(x + "\t"))
25         arr2.foreach(println)
26 
27 
28     }
29 }
30 
31 
32 
33 
34 /*
35 以上代碼執行結果如下 :
36 yinzhengjie    尹正傑    Python    Shell    Golang    Java    Scala    yinzhengjie
37 尹正傑
38 Python
39 Shell
40 Golang
41 Java
42 Scala
43  */

4>.單詞統計案例(wold count)

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object MyArray {
 9 
10     def main(args: Array[String]): Unit = {
11         /**
12           * 定義一個數組,里面存放兩個字符串
13           */
14         val arr = Array.apply[String]("yinzhengjie,尹正傑,yinzhengjie","Python,Shell,Golang,Java,Scala,yinzhengjie")
15 
16 
17         /**
18           * flatMap:
19           *     進行扁平化操作,通過flatMap(_.split(","))可以將2個字符串按照空格切割成單詞
20           * groupBy:
21           *     自然是排序操作了,即按照每個傳進來的參數進行分組,即將相同的單詞包裝成一個數組
22           * mapValues:
23           *     傳遞的參數是一個數組,我們將傳入的數組的長度取出
24           */
25         val arr2 = arr.flatMap(_.split(",")).groupBy(x => x).mapValues(x => x.length)
26         arr2.foreach(x => print(x + "\t"))
27         println("\n=======我是分割線=======")
28         /**
29           * 排序功能:
30           *     又有map默認是無序的,因此我們可以將其轉換成數組,然后在進行排序操作
31           * toList:
32           *     將arr3這個map類型轉換成一個list類型
33           * sortBy:
34           *     排序操作,注意,x._1,其中x表示的是arr3轉換成的list對象,而“_1”表示的是每一個元素的第一個參數,因此排序是按照字母來排序的喲,如果你想按照長度來排序的話把1改成2就好
35           */
36         val arr3 = arr2.toList.sortBy(x=>x._1)
37         arr3.foreach(x => print(x + "\t"))
38     }
39 }
40 
41 
42 
43 
44 /*
45 以上代碼執行結果如下 :
46 (Shell,1)    (Scala,1)    (yinzhengjie,3)    (Python,1)    (尹正傑,1)    (Golang,1)    (Java,1)
47 =======我是分割線=======
48 (Golang,1)    (Java,1)    (Python,1)    (Scala,1)    (Shell,1)    (yinzhengjie,3)    (尹正傑,1)    
49  */

   如果想要按照數字進行倒序排列的話,我們可以看下面的一段代碼也是world count單詞統計:

 1 /*
 2 @author :yinzhengjie
 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 4 EMAIL:y1053419035@qq.com
 5 */
 6 package cn.org.yinzhengjie.function
 7 
 8 object WordCount {
 9     def main(args: Array[String]): Unit = {
10         val words: Array[String] = Array("hello yinzhengjie hello yinzhengjie Python", "hello Python hello yinzhengjie Scala Golang")
11         // words 數組中的每個元素按照空格(" ")進行切分。
12         val wordSplit: Array[Array[String]] = words.map((x: String) => x.split(" "))
13         // 將數組中的Array扁平化
14         val fltWords: Array[String] = wordSplit.flatten
15         // 分組操作 : hello -> Array(hello, hello, hello, hello)
16         val mapWords: Map[String, Array[String]] = fltWords.groupBy((wd: String) => wd)
17         //生成map對象,得到類型這樣的數據 : (hello, 4), (yinzhengjie,1).....
18         val wrdResult: Map[String, Int] = mapWords.map(wdKV => (wdKV._1, wdKV._2.length))
19         // Map不支持排序,需要將map轉換成List, 調用sortBy方法按照單詞數量降序排序(默認是升序,我們在前面加一個負號就可以實現倒序排列)
20         val sortResult: List[(String, Int)] = wrdResult.toList.sortBy(t => - t._2)
21         //遍歷每一個元素
22         sortResult.foreach(i => println(i))
23     }
24 }
25 
26 
27 
28 /*
29 以上代碼實現結果如下 :
30 (hello,4)
31 (yinzhengjie,3)
32 (Python,2)
33 (Scala,1)
34 (Golang,1)
35  */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM