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

  • until vs to

    until 不包括右端点;
    to 包括右端点;

  • 格式化输出

    val i = 100
    val s = "hello world"
    println(f"$i%5s$s%18s")
      100    hello world 
    			  # 最终的输出形式为右对齐,左端不足空格补齐
    

Scala 集合类库很庞大,包括 List,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 一种柯里化函数
    			# 第一个参数表示累加时的初始值 
    
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值