Scala集合——Array,Map,Seq,Set

2497 ワード

  • until vs to untilは右端点を含まない.toは右端点を含む;
  • フォーマット出力
    val i = 100
    val s = "hello world"
    println(f"$i%5s$s%18s")
      100    hello world 
    			  #            ,        
    
  • Scala集合クラスライブラリはリスト,Set,Map,Arrayなど膨大である.toList,toSet,toArray法により,種々の集合型を容易に相互変換できる.
    1. Array
    val a = Array(1, 2, 3)
    
  • 基本操作
  • 配列長:a.length
  • 配列アクセス:a(0)/a(1)/a(2)
  • 配列の末尾の要素:a.last
  • 配列末尾の他の要素を除去する:a.init
  • indexOf:値を下付きに変換:
    val a = Array(0, 0, 1, 0)
    a.indexOf(1)
    			# 2
    val a = Array(0, 0, 1, 1)
    a.indexOf(1)
    			# 2
    			#     Python list    index()     
    
  • toBuffer
    val buf = a.toBuffer
    val arr = buf.toArray
    

  • 2. Map
    ScalaのMapクラスは、コンテンツのキーまたは値に基づいてソートする方法を提供していません.MapをScalaのSeqタイプに変換することができ、Seqはソートをサポートします.
    例えばcountByValue()はscalaを得る.collection.Map[String,Long]のMap集合は、Value(つまり出現回数)に従って並べ替える場合はtoSeqを呼び出してSeqタイプに変換する必要があります.
    rawData.map(_.split(',').last).countByValue().toSeq.sortBy(_._2).reverse.foreach(println)
    

    ScalaのSeqクラスはJavaのListインタフェースと類似しており,いずれも反復可能な集合であり,すなわち決定された長さを有し,下付き文字に基づいて値を検索することができる.
    seq.sortBy(_._1).foreach(println)
    		# _1:   
    seq.sortBy(_._2).reverse.foreach(println)
    		# _2:   
    

    3. Seq
  • 共通メンバー関数:
  • sortBy


  • 4. Set
  • 交差、並列セット、差分セット:scala内のセットの交差、並列セット、差分セット
    scala> Set(1,2,3) & Set(2,4)   // &     interset  
    scala> Set(1,2,3) intersect Set(2,4)
    
    scala> Set(1,2,3) ++ Set(2,4)
    scala> Set(1,2,3) | Set(2,4)   // |     union  
    scala> Set(1,2,3) union Set(2,4)
    
    scala> Set(1,2,3) -- Set(2,4) //   Set(1,3)
    scala> Set(1,2,3) &~ Set(2,4) 
    scala> Set(1,2,3) diff Set(2,4)
    
    //        
    
    scala> Set(1,2,3) + (2,4)
    scala> Set(1,2,3) - (2,4)
    
  • 5.Array補足
  • foldLeftとfoldRight
    def foldLeft[B](z: B)(op: (B, A) => B): B = {
        var result = z
        this.seq foreach (x => result = op(result, x))
        result
      }
    
    def foldRight[B](z: B)(op: (A, B) => B): B =
     reversed.foldLeft(z)((x, y) => op(y, x))
    
    // for internal use
    protected[this] def reversed = {
    var elems: List[A] = Nil
    self.seq foreach (elems ::= _)
    elems
    }
    
    の呼び出し方法:
    > val arr = Array(("", 1), ("", 2), ("", 2))
    			#          
    > arr.foldLeft(0)(_ + _._2)
    6
    			# foldLeft        
    			#