练习1:List类型的使用
要求1: 定义不可变的List
试用如下方法 :: 、 :::、concat、filter、map、append。
要求2:定义可变的List
试用如下方法 :: 、 :::、concat、filter、map、append。
1.1 不可变的List
- :: 方法
// 1. Nil为空列表,使用 :: 将元素放入列表中
val list01 = "baidu" :: "google" :: Nil
val list02 = "Facebook" :: "taobao"::Nil
- ::: 方法
//2. ::: 来连接两个列表
val list03 = list01 ::: list02
// List(baidu, google, Facebook, taobao)
- concat方法
// 3. 连接两个列表
val list04 = List.concat(list01,list02)
- List.::: 方法
// 4. 将list02插入到list01前面生成一个新的集合
val list05 = list01.:::(list02)
- filter
val intList = List(1,2,3,4,5,6)
//5. 过滤,取符合条件的,创建新列表,取偶数
intList.filter(x => x%2 == 0)
// res6: List[Int] = List(2, 4, 6)
- map方法
// 6. 每个元素都做了相同的操作,对每个元素都乘了3
intList.map(x =>x * 3)
// res8: List[Int] = List(3, 6, 9, 12, 15, 18)
- 模拟添加、移除、更新操作,返回新的集合,原来集合不发生改变
// 7. :: ---->将0插入到 intList 的前面生成一个新的List
val newList01 = 0 :: intList
println(newList01 )
// 8. .:: ---> 将7插入到 newList01的前面生成一个新的List
val newList02 = newList01.::(7)
println(newList02)
- 通过查看不可变List的方法,发现并无append 方法
1.2 可变List
查看可变List的方法,发现无:: 、 :::、concat 方法
- ListBuffer的定义、添加元素、删除元素
//1. 引入ListBuffer
import scala.collection.mutable.ListBuffer
val listBuffer01 = ListBuffer(1,2,3)
val listBuffer02 = ListBuffer(4,5,6)
// 2. 向listBuffer01中追加元素,原来的List也会发生改变
listBuffer01.append(9)
// 打印元素
println(listBuffer01)
// ListBuffer(1, 2, 3, 9)
// 3. 删除元素 ---删除index为3的元素( 注意:index从0开始 )
listBuffer01.remove(3)
println(listBuffer01)
// ListBuffer(1, 2, 3)
- ++= 方法
// 4. 将listBuffer02中的元素添加到listBuffer01中,没有生成新的集合
listBuffer01 ++= listBuffer02
println(listBuffer01)
- map 方法
// listBuffer02没有发生改变
listBuffer02.map( x => x * 3)
- filter 方法
// 过滤,但 listBuffer02没有发生改变
listBuffer02.filter( x => x % 2 == 0)
println(listBuffer02)
// ListBuffer(4, 5, 6)
总结
- 对于不可变List,可以模拟添加、移除、更新操作,但这些操作都会返回一个新的集合,原来的集合不会发生改变;可使用:: 、 :::、concat、filter、map方法,不能使用append方法。
- 对可变List 可进行修改、添加、移除一个元素,不会返回新的集合。无:: 、 :::、concat 方法,可使用append、map 、filter 方法。
练习2:Set类型的使用
要求1: Set的两种类型(可变、不可变)的定义
要求2:Set唯一性的试验
要求2:Set的增加、删除
不可变Set
// 默认引用不可变的
val set01 = Set(1,2,3)
// set01: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
可变集合
// 引入 mutable
import scala.collection.mutable.Set
// 此时定义的是可变的集合
val set02 = Set(1,2,3)
// set02: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
Set唯一性的试验
- Set里所有的元素都是唯一的
// 有相同元素,会过滤重复,只留下一个唯一的
val set02 = Set(1,2,3,3)
// set02: scala.collection.mutable.Set[Int] = Set(1, 2, 3)
// 添加相同元素,返回false,添加失败,所以只保留一个唯一的
set02.add(2)
// res14: Boolean = false
- Set的增加
// 为True表示添加成功
set02.add(4)
// res16: Boolean = true
print(set02)
// Set(1, 2, 3, 4)
val set03 = Set("ab","cd","ef")
// 添加"gh"元素
set03 += "gh"
// res22: set03.type = Set(ab, gh, ef, cd)
- Set的删除
print(set02)
// Set(1, 2, 3, 4)
// 移除元素值为1的元素
set02.remove(1)
// res18: Boolean = true
print(set02)
// res19: scala.collection.mutable.Set[Int] = Set(2, 3, 4)
// 移除元素为4的元素
set02.remove(4)
// res20: Boolean = true
print(set02)
// Set(2, 3)
set03 -="ab"
练习3:Tuple元组 的使用
要求1: 对元组进行定义和赋值
要求2:元组的取值访问(通过下标、迭代器)
3.1 对元组进行定义和赋值
val t = (1,2,3.14,"a")
val t1 = new Tuple5(1,2,3,2.7,"cd")
3.2 元组的取值访问(通过下标、迭代器)
- 通过下标
t._1
// Int = 1
t1._5
// String = cd
- 通过迭代器
val t0= (1,2,3.14,"a")
val iterator = t0.productIterator
while(iterator.hasNext){
val ele = iterator.next()
println(ele)
}
课堂练习4:使用迭代器访问map
// 创建不可变的Map
val map1 = Map(1 -> "a",2 -> "b")
import scala.collection.mutable.Map
// 可变Map
val map2 = Map(1 -> "a",2 -> "b")
// 类似于HashMap
val map3 = Map((1,"a"),(2,"b"),(3,"c"),(4,"d"))
map2 += ((4,"d"))
val iter = mapTwo.keysIterator
while(iter.hasNext)
{
val ele = iterator.next()
println("key:"+ele)
}
// 获得value迭代器对象
val valueIter = mapTwo.valuesIterator
while(valueIter.hasNext)
{
val ele = iterator.next()
println("value:"+ele)
}
- foreach方法遍历
map2 .foreach{
case(k,v) => println("key:"+k + ",value: "+v)
}
- Tuple语法访问键/值字段
// 访问第一个字段 key 和第二个字段 value
map2 .foreach(x => println("key:"+x._1 + ",value: "+x._2))
- print 所有的键
// keys方法返回Iterable
map2 .keys.foreach((key) => println(key))
- print 所有的值
map2 .values.foreach((value) => println(value))
练习5:groupBy的使用
要求1:对List[Int]进行分组
要求2:对List[String]根据首字母进行分组
5.1 对List[Int]进行分组
// 分为两组,若为false,则这组为List(1, 3, 5),若为true一组是List(2, 4, 6)
val num = List(1,2,3,4,5,6)
println(num.groupBy(x => x%2 == 0))
5.2 对List[String]根据首字母进行分组
// 根据首字母来分组,分为两组,一组是a开头,一组是d开头
val strList = List("abc","de","aa")
println(strList.groupBy(s => s.charAt(0)))
// Map(d -> List(de), a -> List(abc, aa))