第1关:List 列表的使用
100
- 任务要求
- 参考答案
- 评论8
任务描述
本关任务:连接两个列表并对数据去重。
相关知识
Scala 提供了一套很好的集合实现,Scala 集合分为可变的和不可变的集合。可变集合可以在适当的地方被更新或扩展。也就是说你可以修改,添加,移除一个集合的元素。相比之下,不可变集合类永远不会改变。不过,你仍然可以模拟添加,移除或更新操作。但是这些操作将在每一种情况下都返回
一个新的集合,同时使原来的集合不发生改变。在默认的情况下,Scala 使用的是不可变的集合类。本实训介绍的也是基于不可变集合类。
常见的集合类有 List 列表、Set 集合、Map 映射和元组等。接下来我们将为大家介绍第一种集合---List 列表。
List列表简介
Scala List 列表可以存放重复元素,它有点像数组, 因为它们都是有序存储结构,而且列表中所有元素的类型都一样,但它又不同于数组: 1、列表(List)一旦被创建就不能改变其中的元素; 2、列表(List)底层的数据结构是链接表,而数组是一块连续的内存。
因为列表不可变,所以所有操作它的方法或者构造器都会创建一个新的列表。
定义列表(List)
定义列表有两种方式,分别是实例化 List 对象和构造符构造。
1.实例化 List 对象 我们使用 List[T] 来定义一个 T 类型的列表。T 可以是 String,Int 等基本数据类型,也可以是用户自己定义的类型。
下列代码定义了多种类型的列表:
object ForDemo {
def main(args: Array[String]): Unit = {
// 整数列表
val list: Seq[Int] = List(4, 5, 6)
// 字符串列表
val list1: Seq[String] =List("edu","coder")
// 空列表
val list2=List()
// 打印列表
println(list)
println(list1)
println(list2)
}
}
执行结果:
List(4,5,6)
List(edu, coder)
List()
2.构造符构造 构造列表的两个基本元素是 Nil 和 ::。Nil 代表一个空列表。:: 的发音为“cons”,它可以把新元素组合到现有列表的最前端,然后返回作为执行结果的新列表。
object ForDemo {
def main(args: Array[String]): Unit = {
// 整数列表
val list: Seq[Int] = 1 :: (2 :: (3 :: (4 :: Nil)))
// 字符串列表
val list1: Seq[String] ="edu" :: ("coder" :: Nil)
// 空列表
val list2=Nil
// 打印列表
println(list)
println(list1)
println(list2)
}
}
执行结果:
List(1, 2, 3, 4)
List(edu, coder)
List()
列表的常用操作
三个最基本的操作
Scala List 有三个基本操作:
方法名 | 说明 |
---|---|
head | 返回列表第一个元素 |
tail | 返回一个列表,包含除了第一元素之外的其他元素 |
isEmpty | 在列表为空时返回 true |
这些最基本的操作可应用于任何 Scala List 列表。实例如下:
object ForDemo {
def main(args: Array[String]): Unit = {
// 字符串列表
val list: Seq[String] ="腾讯":: ("百度" :: ("阿里" :: Nil))
// 打印列表
println("列表中第一家公司是:"+list.head)
println("列表中除了第一家公司之外的公司是:"+list.tail)
println("查看列表是否为空 :"+list.isEmpty)
}
}
执行结果:
列表中第一家公司是:腾讯
列表中除了第一家公司之外的公司是:List(百度, 阿里)
查看列表是否为空 :false
连接列表
使用 ::: 运算符或 List.:::() 方法来连接两个或多个列表。实例如下:
object ForDemo {
def main(args: Array[String]): Unit = {
// 字符串列表
val list: Seq[String] ="腾讯":: ("百度" :: ("阿里" :: Nil))
// 整数列表
val list1=List(1,2)
val list2=List(3,4)
// 连接列表并打印
println(list1.:::(list2))
println(list1:::list2)
}
}
执行结果:
List(3, 4, 1, 2)
List(1, 2, 3, 4)
需要注意的是,上述两种连接方式的连接顺序是不一样的,另外,不同类型的列表是无法拼接的,比如代码中的字符串列表 list 和整数列表 list1 、list2 是无法连接的。
其他常用方法
方法 | 说明 |
---|---|
+: | 为列表添加一个元素,并返回一个新列表 |
contains | 检测列表中是否包含某元素 |
distinct | 去除重复元素,并返回一个新列表 |
示例:
object ForDemo {
def main(args: Array[String]): Unit = {
// 整数列表
val list1=List(1,2)
// 为列表添加元素2
val list2=2+:list1
println(list2)
// 判断列表是否包含元素1
println(list2.contains(1))
// 去除列表重复元素
println(list2.distinct)
}
}
执行结果:
List(2, 1, 2)
true
List(2, 1)
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,连接两个列表并对数据去重,具体要求如下:
- 接收给定的多行数据(例:4 \n 56 \n 5 \n -10 \n 10,其中第一个数代表列表长度,其余数代表具体值,\n 仅用来说明前一个数与另一个数之间是换行,实际数据中并没有);
- 将接收到的数据添加进列表,并把该列表连接到列表 list 之后;
- 对连接后的集合数据去重,并输出去重后的集合。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
例: 测试输入:
4
3
4
6
2
预期输出:
List(2, 4, 5, 3, 6)
开始你的任务吧,祝你成功!
import scala.collection.mutable.ArrayBuffer
import scala.io.StdIn
object ForDemo {
def main(args: Array[String]): Unit = {
// 创建集合list
val list = List(2, 4, 5)
// 接收给定的第一个数据
val n = StdIn.readInt()
// 创建数组
var arr = new ArrayBuffer[Int]()
// 将数据添加到数组
for (x <- 1 to n) {
var line = StdIn.readLine()
var line1 = line.toInt
arr.insert(x - 1, line1)
}
// 将数组转为列表
val list1 = arr.toList
// 请在 Begin-End 间编写代码
/********** Begin **********/
// 按要求连接列表并去重,最后输出去重后的列表
val combinedList = list ++ list1
val distinctList = combinedList.distinct
println(distinctList)
/********** End **********/
}
}