-
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> 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 一种柯里化函数 # 第一个参数表示累加时的初始值