2.2
Iterable
Iterable 表示一个可以迭代的集合,它继承了 Travsersable 特质,同时也是其他集合的父特质。它定义了获取迭代器的方法,这是一个抽象方法。
遍历集合示例:
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4, 5)
//方式一 主动迭代
val iterator = list.iterator
while (iterator.hasNext)
print(iterator.next() + " ")
//方式二 被动迭代
list.foreach(x => print(x + " "))
}
分组遍历示例:
def main(args: Array[String]): Unit = {
val i = (1 to 5).toIterable
val iterator = i.grouped(2)
while (iterator.hasNext)
print(iterator.next() +" ")//Vector(1, 2) Vector(3, 4) Vector(5)
}
按照索引生成元组:
def main(args: Array[String]): Unit = {
val i = Iterable("A", "B", "C", "D", "E")
val tuples = i.zipWithIndex.map(x => x._2 -> x._1)
println(tuples)//List((0,A), (1,B), (2,C), (3,D), (4,E))
}
判断集合是否相同:
def main(args: Array[String]): Unit = {
val i1 = Iterable("A", "B", "C")
val i2 = Iterable("A", "C", "B")
val i3 = Iterable("A", "B", "C")
println(i1.sameElements(i2))//false
println(i1.sameElements(i3))//true
}
Seq
Seq 特质代表 按照一定顺序排列的元素序列,序列是一种特别的可迭代集合,它的特点是有序、可重复、有索引
创建 Seq 集合:
def main(args: Array[String]): Unit = {
val seq = (1 to 5).toSeq
println(seq)//Range(1, 2, 3, 4, 5)
}
获取长度及元素:
通过 length 或 size 方法获取长度,通过索引直接获取元素。
def main(args: Array[String]): Unit = {
val seq = (1 to 5).toSeq
println(seq.length)//5
println(seq.size)//5
println(seq(0))//1
}
获取指定元素的索引值
indexOf 获取指定元素在列表中第一次出现的位置
lastIndexOf 获取指定元素在列表中最后一次出现的位置
indexWhere 获取满足条件的元素,在集合中第一次出现的索引
lastIndexWhere 获取满足条件的元素,在集合中最后一次出现的索引
indexOfSlice 获取指定的子序列在集合中第一次出现的位置
找不到返回 -1。
判断是否包含指定数据:
startsWith 是否以指定子序列开头
endsWith 是否以指定子序列结尾
contains 判断是否包含某个指定数据
containsSlice 判断是否包含某个指定子序列
修改指定的元素:
updated 修改指定索引位置的元素为指定的值。
patch 修改指定区间的元素为指定的值。
def main(args: Array[String]): Unit = {
val seq = (1 to 5).toSeq
val seq1 = seq.updated(0, 5)
println(seq1)//Vector(5, 2, 3, 4, 5)
//参数1 起始索引 参数2 替换后的元素 参数3 替换几个
val seq2 = seq.patch(1, Seq(1, 2), 3)
println(seq2)//Vector(1, 1, 2, 4, 5)
}
Stack
top 获取栈顶元素
push 入栈
pop 出栈
clear 清除所有元素
mutable.Stack 有一个独有方法 pushAll,把多个元素压入栈中。
ArrayStack 有独有方法为:dup,复制栈顶元素。preseving,执行表达式,执行完毕后恢复栈。
操作示例:
def main(args: Array[String]): Unit = {
//从右往左入栈
val s = mutable.Stack(1, 2, 3, 4, 5)
println(s.top)//1
println(s.push(6))//Stack(6, 1, 2, 3, 4, 5)
println(s.pushAll(Seq(7, 8, 9)))//Stack(9, 8, 7, 6, 1, 2, 3, 4, 5)
println(s.pop())//9
println(s.clear())//()
}
定义可变栈存储1-5,通过dup方法复制栈顶元素,通过preseving 方法先清空元素再恢复。
def main(args: Array[String]): Unit = {
//从右往左入栈
val s = mutable.ArrayStack(1, 2, 3, 4, 5)
//复制栈顶元素
s.dup()
println(s)//ArrayStack(1, 1, 2, 3, 4, 5)
s.preserving({
//该方法执行后,栈中数据会恢复
s.clear()
})
println(s)//ArrayStack(1, 1, 2, 3, 4, 5)
}
Queue
表示队列,特点是 FIFO,常用的队列是 mutable.Queue,内部以 MutableList 实现。
enqueue 入队
dequeue 出队
dequeueAll 移除所有满足条件的元素
dequeueFirst 移除第一个满足条件的元素
案例:统计字符个数
提示用户录入字符串并接受,统计每个字符出现的次数并打印。
def main(args: Array[String]): Unit = {
println("请输入一个字符串:")
val str = StdIn.readLine()
val map = mutable.Map[Char, Int]()
for(c <- str.toCharArray){
if(!map.contains(c))
map += c -> 1
else
map += c -> (map.getOrElse(c, 1) + 1)
}
map.foreach(println(_))
}