Scala集合之Seq

本文详细介绍了Scala中的集合操作,包括Seq、Set和Map的使用,以及可变和不可变集合的区别。重点讲解了Seq的子特质IndexedSeq和LinerSeq,以及如何获取序列的长度、元素、索引,查找子序列,排序,反转,去重,组合等操作。此外,还涵盖了集合的交集、差集、并集以及distinct、permutations和combinations等方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述

  • 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)
  • 将序列进行转换
  • 便函数的应用
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值