1. 程式人生 > >Scala教程(十二)List操作高階進階實戰

Scala教程(十二)List操作高階進階實戰

1 List基本操作

1.1 List組成結構

陣列由head tail兩部分組成:head表示第一個元素,tail表示其它元素。

    val bigData = List("Hadoop","Spark")
    val data = List(1,2,3)
    
    // 陣列由head tail兩部分組成:head表示第一個元素,tail表示其它元素
    val bigDataCore = "Hadoop" :: ("Spark"::Nil );
    val dataInt = 1 :: 2 :: 3 :: Nil
    
    // 是否為空
    println(data.isEmpty);
    // 第一個元素:  1
    println(data.head)
    // 其它元素:2,3
    println(data.tail);
    
    
    // 提取bigData中元素內容,陣列中的元素長度,必須和List()中引數一致
    val List(a,b) = bigData;
    // 執行結果:a=Hadoop,b=Spark
    println("a="+a+",b="+b);
    
    // 第一個元素,第二個元素,及餘其它的元素及List
    val x::y::rest = data
    // 執行結果:x=1,y=2,rest=List(3)
    println("x="+x+",y="+y+",rest="+rest);

1.2 list模式匹配

  def main(args: Array[String]): Unit = {
    // 模式匹配
    val shuffledData = List(6, 3, 5, 6, 2, 9, 1)
    println(sortList(shuffledData))

    // 排序
    def sortList(dataSet: List[Int]): List[Int] = dataSet match {
      case List()       => List()
      case head :: tail => compute(head, sortList(tail))
    }

    def compute(data: Int, dataSet: List[Int]): List[Int] = dataSet match {
      case List() => List(data);
      // 如果集合第一個元素值小於data值,data放在第一個位置
      case head :: tail => if (data <= head) data :: dataSet
      // 如果不小於data值,進行下次比較
      else head :: compute(data, tail);
    }
  }

1.3 :::操作符

連線符:::進行list與list之間連線

    // list與list之間進行連線符:::
    println(List(1,2,3,4) ::: List(4,5,6,7,8) ::: List (10,11));
    println(List(1,2,3,4) :::(List(4,5,6,7,8):::List(10,11)));
    println(List(1,2,3,4) :::List(4,5,6,7,8):::List(10,11));
    
    // lenght方法特別慢
    println(List(1,2,3,4).length)

1.4 List一階函式操作

    var bigData = List("Hadoop","Spark","Kaffka")
    // 最後一個元素,執行結果:Kaffka
    println(bigData.last);
    // 除最後一個元素外的元素,執行結果:List(Hadoop, Spark)
    println(bigData.init);
    // 反轉後的內容,執行結果:List(Kaffka, Spark, Hadoop)
    println(bigData.reverse)
    // 打印出自己本身,執行結果:List(Hadoop, Spark, Kaffka)
    println(bigData)
    // 獲取前兩個元素,執行結果:List(Hadoop, Spark)
    println(bigData.take(2))
    // 刪除前兩2個元素,執行結果:List(Kaffka)
    println(bigData.drop(2))
    // 折分為,前面兩個為一組,後面元素為一組,執行結果:(List(Hadoop, Spark),List(Kaffka))
    println(bigData splitAt(2));
    // 通過索引獲得元素:索引從0開始,執行結果:Kaffka
    println(bigData apply(2))
    println(bigData(2))
    
    // 宣告list
    val data = List('a','b','c','d','e','f','g');
    // 獲得所有的元素的索引,執行結果:Range(0, 1, 2, 3, 4, 5, 6)
    println(data.indices);
    // zip配對組合操作,執行結果:Vector((0,a), (1,b), (2,c), (3,d), (4,e), (5,f), (6,g))
    println(data.indices zip data);
    // zip配對組合操作,執行結果:List((a,0), (b,1), (c,2), (d,3), (e,4), (f,5), (g,6))
    println(data.zipWithIndex);
    // toString方法,執行結果:List(a, b, c, d, e, f, g)
    println(data.toString());
    // 返回兩端以中括號開頭、結束,中間以分號隔,執行結果:[a;b;c;d;e;f;g]
    println(data.mkString("[",";","]"));
    // 格式化輸出字串,執行結果:a    b    c    d    e    f    g
    println(data.mkString("    "));
    // 無任格式輸出,執行結果:abcdefg
    println(data.mkString);
    
    // 將資料操作的結果賦值在buffer物件,執行結果:(a;;b;;c;;d;;e;;f;;g)c
    val buffer = new StringBuilder();
    data.addString(buffer,"(",";;",")");
    println(buffer);
    
    // list和陣列相互轉換
    val array =data
    println(array.toArray);
    println(array.toList);
    
    // copy data物件中的元素到newArray陣列中,copy到3以後的位置
    val newArray = new Array[Char](10)
    data.copyToArray(newArray,3)
    // 執行結果:   abcdefg
    newArray.foreach(print)
    
    /*
     *  能過iterator集合中.next獲取陣列
     *  a
     *  b
     */
    val iterator = data.toIterator
    println(iterator.next())
    println(iterator.next())

2 List常用函式

2.1 List函式操作(一)

ListmapflatMapforeachfilter函式操作。

    // list中的元素 * 2 操作,執行結果:List(2, 4, 6, 8, 10, 12)
    println(List(1,2,3,4,5,6).map(_*2))
    
    val data = List("Scala","Hadoop","Spark")
    
    // 獲取每個元素的長度,執行結果:List(5, 6, 5)
    println(data.map(_.length()))
    
    // 轉為List內容進行反轉,執行結果:List(alacS, poodaH, krapS)
    println(data.map(_.toList.reverse.mkString))
    
    // 把元素中的每個元素轉成List,執行結果:List(List(S, c, a, l, a), List(H, a, d, o, o, p), List(S, p, a, r, k))
    println(data.map(_.toList));
     
    // 將list元素分成多個list元素,再重新合成新的List元素,執行結果:
    println(data.flatMap(_.toList))
    
    /* 1到9不包含10,執行結果:
     * List((2,1),
     * (3,1), (3,2), 
     * (4,1), (4,2), (4,3), 
     * (5,1), (5,2), (5,3), (5,4), 
     * (6,1), (6,2), (6,3), (6,4), (6,5), 
     * (7,1), (7,2), (7,3), (7,4), (7,5), (7,6), 
     * (8,1), (8,2), (8,3), (8,4), (8,5), (8,6), (8,7), 
     * (9,1), (9,2), (9,3), (9,4), (9,5), (9,6), (9,7), (9,8))
     */
    println(List.range(1, 10).flatMap(i => List.range(1, i).map(j => (i,j))))
    
    // list中的元素,1到5連加,執行結果:sum=15
    var sum = 0;
    List(1,2,3,4,5).foreach(sum+=_);
    println("sum="+sum)
    
    // 生成元素list,從1到10,不包含11,過慮出偶數,執行結果:List(2, 4, 6, 8, 10)
    println(List.range(1, 11).filter { x => x % 2 == 0});
    // 過慮data元素長度為5的元素
    println(data.filter { str => str.length() ==5 }) 

2.2 List函式操作(二)

ListpartitionfindtakeWhiledropWhilespanforallexsists函式操作。

    /*
     * 分割槽partition
     */
    // 按照是否為偶數,分成兩個List,執行結果:(List(2, 4),List(1, 3, 5))
    println(List(1,2,3,4,5).partition(_ %2 == 0))
    
    // 返回Option,返回第一個符合的值,沒有符合的值返回None
    println(List(1,2,3,4,5,6).find { x => x%2 == 0 })
    println(List(1,2,3,4,5).find { x => x <= 0 })
    
    // 根據條件獲取小於4的元素值,並返回List,執行結果:List(1, 2, 3)
    println(List(1,2,3,4,5).takeWhile(_<4));
    
    // 最大程度剪下掉符合條件值
    println(List(1,2,3,4,5).dropWhile { x => x <4 })
    
    // 符合條件的一部分,不符條件為別外一部分,執行結果:(List(1, 2, 3),List(4, 5))
    println(List(1,2,3,4,5).span { x => x < 4 })
    
    def hastotallyZeroRow(m:List[List[Int]]) = 
      m.exists{
          // forall:如果元素都等於0,那麼返回true,否則返回false
          row => row forall{x => x == 0}
      }
    
    val m = List(List(1,0,0),List(0,1,0),List(0,0,0))
    println(hastotallyZeroRow(m));

2.3 List函式操作(三)

ListfoldLeftfoldRightsort函式操作。

    def main(args: Array[String]): Unit = {
      // foldLeft初始值為:0,從1加到100,執行結果:5050
      println((1.to(100).foldLeft(0)(_ + _)));
  
      // 初始值為:0,1-100組成元素的集合,使用相加的函式做為引數傳遞進行相加
      println((0 /: (1 to (100)))(_ + _));
  
      // 初始值為:100,每次都相減,計算過程,(1-(2-(3-(4-(5-100))))),執行結果:-97
      println((1.to(5)).foldRight(100)(_ - _));
      println(((1.to(5)) :\ 100)(_ - _))
  
      /*
             *  排序
             *  執行結果:List(-3, 1, 2, 4, 6, 8)
               *  List(8, 6, 4, 2, 1, -3)
             */
      println(List(1, 2, -3, 4, 6, 8).sortWith(_ < _));
      println(List(1, 2, -3, 4, 6, 8).sortWith(_ > _));
    }

2.4 List函式操作(四)

ListBufferArrayBufferQueueStack函式操作。

  def main(args: Array[String]): Unit = {
    import scala.collection.mutable.ListBuffer;
    val listBuffer = new ListBuffer[Int]();
    // 追加元素
    listBuffer += 1;
    listBuffer += 2;
    // 執行結果:ListBuffer(1, 2)
    println(listBuffer);
    
    import scala.collection.mutable.ArrayBuffer;
    val arrayBuffer = new ArrayBuffer[Int]();
    arrayBuffer += 1;
    arrayBuffer += 2;
    // 執行結果:ArrayBuffer(1, 2)
    println(arrayBuffer);
    
    
    /**
     * immutable包中的不可變Queue
     */
    import scala.collection.immutable.Queue
    val empty = Queue[Int]();
    // 加一個元素,Queue本身是不可變的,每次操作都會生成一個新的Queue
    val queue1 = empty.enqueue(1);
    val queue2 = queue1.enqueue(List(2,3,4,5))
    // 執行結果:Queue(1, 2, 3, 4, 5)
    println(queue2);
    
    // 將quenue2拆分成兩部分:第一個元素,和剩下的一個元素組成Queue兩部分
    val(element,left) = queue2.dequeue
    // 執行結果:1:Queue(2, 3, 4, 5)
    println(element +":"+left);
    
    /**
     * mutable包中的可變Queue
     */
    import scala.collection.mutable.Queue
    val queue = scala.collection.mutable.Queue[String]();
    queue += "a";
    // 追加List
    queue ++=List("b","c");
    // 執行結果:Queue(a, b, c)
    println(queue);
    // 與不可變的Queue不同,可變的Queue只返回第一個元素,並且把第一個元素從Queue中刪除,執行結果:a
    println(queue.dequeue())
    // 執行結果:Queue(b, c)
    println(queue);
    
    
    /**
     *  mutable包中Stack
     */
    import scala.collection.mutable.Stack;
    val stack = new Stack[Int]();
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(10);
    // 返回stack頂元素:10,執行結果:10
    println(stack.top);
    // 執行結果:Stack(10, 3, 2, 1)
    println(stack);
    // 返回stack頂元素,且將返stack頂元素進行刪除,執行結果:10
    println(stack.pop);
    // 執行結果:Stack(3, 2, 1)
    println(stack);
  }

2.5 List伴生物件函式操作

  def main(args: Array[String]): Unit = {
    // 生成List物件,執行結果:List(1, 2, 3, 4, 5)
    println(List.apply(1, 2, 3, 4, 5))

    // 生成1-4List,包前,不包後,執行結果:List(1, 2, 3, 4)
    println(List.range(1, 5));

    // 生成9-1List,每次步長為-2,執行結果:List(9, 7, 5, 3)
    println(List.range(9, 1, -2));

    /*
		   *  zip操作與反zip操作,執行結果:
		   *  List((a,1), (b,2), (c,3), (d,4), (e,5), (f,6))
			 *  (List(a, b, c, d, e, f),List(1, 2, 3, 4, 5, 6))
		   */
    val zipped = "abcdef".toList.zip("123456789").toList
    println(zipped);
    println(zipped.unzip)

    // 將所有的集合中的元素,合成一個大集合,執行結果:List(a, b, c, d, e, f)
    println(List(List('a', 'b'), List('c', 'd'), List('e', 'f')).flatten);
    // 將集合內容合併,執行結果:List(b, c)
    println(List.concat(List(), List('b'), List('c')))
  }



    --以上為List操作高階進階實戰內容,謝謝大家對我的關注。

                                                                                                                                                                                      ——厚積薄發(yuanxw)