1. 程式人生 > >scala學習筆記(十二) 集合

scala學習筆記(十二) 集合

Scala的集合分為三大分支序列對映

1、所有集合都擴充套件自Iterable特質

2、幾乎所有的集合都分為可變與不可變版本

3、集(Set不保證插入順序的

4、使用 +來新增元素, -來移除元素+:新增到頭部,:+新增到尾部, ++用來將兩個集合拼接, --移除後面集合的所有元素

5scala的集合中已經包含了很多內建的遍歷方法,一般來說在你需要寫迴圈來處理集合元素的時候,都應該先考慮集合自帶的這些

Scala中的集合分為可變集合與不可變集合,分別在 scala.collection.mutable包中和 scala.collection.immutable包中

Scala

中沒有更好的同步集合,如果有需要使用同步集合可考慮使用javaconcurrent包中的同步集合。

Scala中有可以支援多執行緒並行執行的集合 ParSeqParSet ParMap,但是有一個基本要求是執行的函式式不依賴元素順序的。

普通集合可以通過par方法轉成並行集合,如下是在多執行緒中執行的:

 for (i <- (1 to 100).par) println(i +"")

println((1to 100000).par sum)

集合中很多內容並不好簡單的寫出來,下面是一些練習:

package demo

import scala.collection.immutable.HashMap
import scala.collection.mutable.ArrayBuffer
import sun.org.mozilla.javascript.internal.ast.Yield

/**
 * @author Administrator
 */
object ScalaIterable {
  def main(args: Array[String]): Unit = {
    //    for (i <- (1 to 100).par) println(i + "")

    indexes("yangmingwei") foreach (println)

    val al = List(2, 3, 2, 0, 2, 5, 0)

    val al2 = removeZero(al)

    println(al)
    println(al2)

    val s = Array("Tom", "Fred", "Harry")
    val m = Map("Tom" -> 3, "Harry" -> 5)

    println(fun(s, m).mkString)

    println(mkString(1 to 10))

    println((al :\ List[Int]())((n: Int, a: List[Int]) => a :+ n))

    println((List[Int]() /: al)(_ :+ _))

    grouped(Array(1, 2, 3, 4, 5, 6, 7, 8), 3) foreach { x => println(x.mkString("[", ",", "]")) }

  }

  def removeZero(arg: List[Int]) = {

    arg filter (_ != 0)
  }

  def grouped(arr: Array[Double], n: Int) = {
//    val tmp = ArrayBuffer[Array[Double]]()
//    var tmp2 = ArrayBuffer[Double]()
//    for (value <- arr) {
//      tmp2 += value
//      if (tmp2.length == n || (tmp.length * n + tmp2.length == arr.length)) {
//        tmp += tmp2.toArray
//        tmp2 = ArrayBuffer[Double]()
//      }
//    }
//    tmp.toArray
    
    val tb = arr.toBuffer
    tb.sliding(n,n).toArray
  }

  def fun(strArrays: Array[String], m: Map[String, Int]) = {
    strArrays flatMap { x => m.get(x) }
  }

  def mkString(seq: Seq[Any]) = {
    seq.reduceLeft(_ + "" + _)
  }

  def indexes(str: String) = {
    var mp = new HashMap[Char, ArrayBuffer[Int]]
    for (i <- (0 until str.length)) {
      if (mp.contains(str(i))) {
        mp(str(i)) += i
      } else {
        mp += (str(i) -> ArrayBuffer(i))
      }
    }
    mp
  }

}