-
Scala 的集合分为三大类序列Seq,集Set 以及映射Map。所有的集合都扩展自 Iterable 特质在 Scala 中集合有可变(“scala.collection.mutable” 包下存放)和不可变(“scala.collection.immutable” 包下存放)两种类型。
-
Seq 提供了两个重要的子特质:IndexedSeq 和LinerSeq。适合不同性能的应用场景。IndexedSeq 提供了快速访问元素的功能,而linerSeq可以迅速访问head 和tail。
-
得到序列的长度
size,length,lengthCompare -
得到指定索引的元素
scala> t.apply(2)
val res29: Int = 3
scala> t(2)
val res30: Int = 3
- 寻找指定元素的索引
scala> t.indexOf(2)
val res24: Int = 1
scala> t.lastIndexOf(2)
val res28: Int = 1
- 寻找满足条件的元素索引
val t: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> t.indexWhere(x=>(x%2==0)&&x<5)
val res19: Int = 1
scala> t.lastIndexWhere(x=>(x%2==0)&&x<5)
val res23: Int = 3
-寻找指定的子序列
indexOfSclice lastINdexOfsclice
scala> t.indexOfSlice(Seq(7,8))
val res32: Int = 6
scala> t.lastIndexOfSlice(Seq(8,9))
val res36: Int = 7
- 寻找满足条件的子序列的长度
segmentLength prefixLength
def segmentLength(p:(A)=>Boolean,from Int)
scala> t.segmentLength(_ <5)
val res42: Int = 4
scala> t.segmentLength(_ <5,2)
val res43: Int = 2
t.segmentLength(_ <5) 实际上是从第一个位置查找。
- 增加元素到序列中
+: :+ padTo
scala> t.padTo(8,6)
val res48: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> 3+:t
val res49: Seq[Int] = List(3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> 3+:t
val res50: Seq[Int] = List(3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
- 替换序列中的元素 patch
def patch(from :int,that:GenSeq[A],replaces:Int):Seq[A]
scala> t
val res51: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> t.patch(5,Seq(10,20),3)
val res52: Seq[Int] = List(1, 2, 3, 4, 5, 10, 20, 9, 10)
-更新指定位置的索引
虽然patch 方法也可以实现,但Scala还有更简便的方法,那就是updated.
scala> t
val res53: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> t.updated(1,8)
val res55: Seq[Int] = List(1, 8, 3, 4, 5, 6, 7, 8, 9, 10)
- 排序
sorted ,sortWith,sortBy
scala> import util.Random.nextInt
import util.Random.nextInt
scala> val t=Seq.fill(5)(nextInt(100))
val t: Seq[Int] = List(68, 50, 78, 18, 81)
scala> t.sorted
val res62: Seq[Int] = List(18, 50, 68, 78, 81)
scala> t.sortBy(x=>(x.toString.length,x))
val res69: Seq[Int] = List(18, 50, 68, 78, 81)
scala> t.sortWith(_ -_ <0)
val res77: Seq[Int] = List(18, 50, 68, 78, 81)
- 反转一个序列
reverse,reverseIterator, reverseMap
scala> t
val res78: Seq[Int] = List(68, 50, 78, 18, 81)
scala> t.reverse
val res80: Seq[Int] = List(81, 18, 78, 50, 68)
scala> t.reverseIterator.next()
val res84: Int = 81
scala> t.reverseMap(_+10)
^
warning: method reverseMap in trait SeqOps is deprecated (since 2.13.0): Use .reverseIterator.map(f).to(...) instead of .reverseMap(f)
val res88: Seq[Int] = List(91, 28, 88, 60, 78)
scala> t.reverseIterator.map(_+10)
val res99: Iterator[Int] = <iterator>
scala> t.reverseIterator.map(_+10).next()
val res100: Int = 91
- 序列是否包含某个前缀或者后缀
startWith endsWith
scala> t
val res101: Seq[Int] = List(68, 50, 78, 18, 81)
scala> t.startsWith(Seq(68,50))
val res104: Boolean = true
scala> t.startsWith(Seq(68,53))
val res105: Boolean = false
scala> t.endsWith((Seq(18,81)))
val res108: Boolean = true
- 序列是否包含某个子序列
contains containsSclice
scala> t
val res114: Seq[Int] = List(68, 50, 78, 18, 81)
scala> t.contains(3)
val res115: Boolean = false
scala> t.containsSlice(Seq(5,78))
val res117: Boolean = false
- 集合操作
intersect diff union - 去掉重复的元素 distinct
scala> val t1=Seq(1,2,3,4,5,6,7,33,2,1,2)
val t1: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 33, 2, 1, 2)
scala> t.distinct
val res120: Seq[Int] = List(68, 50, 78, 18, 81)
scala> t1.distinct
val res123: Seq[Int] = List(1, 2, 3, 4, 5, 6, 7, 33)
- 得到各元素的各种排列 permutations
scala> val t1=Seq(1,2,3)
val t1: Seq[Int] = List(1, 2, 3)
scala> val p=t1.permutations
val p: Iterator[Seq[Int]] = <iterator>
scala> p.foreach(println)
List(1, 2, 3)
List(1, 3, 2)
List(2, 1, 3)
List(2, 3, 1)
List(3, 1, 2)
List(3, 2, 1)
- 得到序列的指定长度的元素的组合
permutations combinations
scala> val s=Seq(4,3,2,1)
val s: Seq[Int] = List(4, 3, 2, 1)
scala> val c=s.combinations(3)
val c: Iterator[Seq[Int]] = <iterator>
scala> c.foreach(println)
List(4, 3, 2)
List(4, 3, 1)
List(4, 2, 1)
List(3, 2, 1)
- 将序列进行转换
- 便函数的应用