arr1.toBuffer //定长数组转可变数组
arr2.toArray //可变数组转定长数组
说明:
arr2.toArray 返回结果才是一个定长数组, arr2本身没有变化
arr1.toBuffer返回结果才是一个可变数组, arr1本身没有变化
val arr = ArrayBuffer("1", "2", "3") //Scala集合
import scala.collection.JavaConversions.bufferAsJavaList
val javaArr = new ProcessBuilder(arr) //Java集合
val arrList = javaArr.command() //Scala集合
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable
// java.util.List ==> Buffer
val scalaArr: mutable.Buffer[String] = arrList
scalaArr.append("jack")
//说明:
arr 是一个二维数组
有三个元素[一维数组]
每个一维数组存放4个值
//赋值
arr(1)(1) = 11.11
val t1 = (1, "a", "b", true, 2)
println(t1._1) //方法一:访问元组的第一个元素 ,从1开始
println(t1.productElement(0)) // 方法二:访问元组的第一个元素,从0开始
for(item <- t1.productIterator){}//方法三:遍历
val value1 = list1(1) // 1是索引,表示取出第2个元素
符号 | 应用 |
---|---|
:+ | 运算符表示在列表的最后增加数据val list02 = list01 :+ 4 |
+: | 运算符表示在列表的最前增加数据val list2 = 4 +: list1 |
:: | 表示向集合中添加元素 |
::: | 将集合中的元素加入到集合中去 |
val list1 = List(1, 2, 3, "abc")
val list5 = 4 :: 5 :: 6 :: list1 :: Nil //打印:List(4, 5, 6, List(2, 3, 4))
val list7 = 4 :: 5 :: 6 :: list1 ::: Nil //打印:List(4, 5, 6, 2, 3, 4)
val list5 = 4 :: 5 :: 6 :: list1 :: 9 // 错误:最右边9不是集合无法添加元素
val lst0 = ListBuffer[Int](1, 2, 3)
val lst1 = new ListBuffer[Int]
//向原集合中添加元素
lst1 += 4
lst1.append(5,6) //一次可添加多个元素
//生成新的集合
lst0 ++= lst1
val lst2 = lst0 ++ lst1
val lst3 = lst0 :+ 5
val q1 = new Queue[Int]
q1 += 20
q1 ++= List(2,4,6)
q1.enqueue(20,60) //添加元素
q1.dequeue() //返回并删除一个元素
println(q1.head) //返回队列的第一个元素,对队列本身没有任何影响
println(q1.last) //返回队列最后一个元素,对队列本身没有任何影响
println(q1.tail) //返回队列的尾部,即:返回除了第一个以外剩余的元素
println(q1.tail.tail) //可以级联使用,这个在递归时使用较多
a) Map中的元素底层是Tuple2类型,创建时默认情况下(即没有引入其它包的情况下),Map是不可变Mapa) Map中的元素底层是Tuple2类型,创建时默认情况下(即没有引入其它包的情况下),Map是不可变Map
al map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
b) 指定可变Map的包
val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
c) HaMap可以通过new创建,其他不可以
val map3 = new scala.collection.mutable.HashMap[String, Int]
d) 通过对偶元组创建,和第一种方法等价
val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) )
a) 使用map(key)取值,如果key存在,则返回对应的值,如果key不存在,则抛出异常
[java.util.NoSuchElementException],在Java中,如果key不存在则返回null
val value1 = map2("Alice")
b) 使用contains方法检查是否存在key,返回Boolean
map4.contains("B")
c) 使用map.get(key).get取值
var map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
println(map4.get("A")) //如果key存在返回Some对象,不存在返回None
println(map4.get("A").get) //通过Some取值,key存在,返回对应值,否则抛出异常
java.util.NoSuchElementException: None.get
d) 使用map4.getOrElse()取值
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
println(map4.getOrElse("A","默认"))
//如果key存在,返回key对应的值。
//如果key不存在,返回默认值。
e) 如何选择取值方式建议
4. 修改、添加、删除
a) 修改
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4(“A”) = 20 //修改或增加,map 是可变的,才能修改,否则报错
b) 添加
//添加单个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4 += ( "D" -> 4 )
//添加多个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
val map5 = map4 + ("E"->1, "F"->3) //创建新的Map集合
map4 += ("EE"->1, "FF"->3) //原有集合添加
c) 删除
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4 -= ("A", "B") //一次可删除多个键值对,key存在则删除,不存在也不报错
5. 遍历
val map1 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
for ((k, v) <- map1) println(k + " is mapped to " + v)
for (v <- map1.keys) println(v) //打印key值
for (v <- map1.values) println(v) // 打印value值
for(v <- map1) println(v)
输出结果:
A is mapped to 1
C is mapped to 3
B is mapped to 北京
A
C
B
1
3
北京
(A,1)
(C,3)
(B,北京)
val set = Set(1, 2, 3) //不可变
import scala.collection.mutable.Set
val mutableSet = Set(1, 2, 3) //可变
3. 可变集合元素添加、删除
//添加 如果添加的对象已经存在,则不会重复添加,也不会报错
mutableSet.add(4) //方式1
mutableSet += 6 //方式2
mutableSet.+=(5) //方式3
//删除
val set02 = mutable.Set(1,2,4,"abc")
set02 -= 2 // 操作符形式
set02.-=(4) // ok
set02.remove("abc") // 方法的形式,scala的Set可以直接删除值
4. 遍历
val set02 = mutable.Set(1, 2, 4, "abc")
for (x <- set02) {println(x)}
将集合中的每一个元素通过指定功能(函数)映射(转换)成新的结果集合这里其实就是所谓的将函数作为参数传递给另外一个函数,这是函数式编程的特点。
举例:将英文编程大写字母
val names = List("Alice","Bob","Nick")
//val names2 = names.map((s:String)=>s.toUpperCase)
val names2 = names.map(_.toUpperCase) //简写
打印:List(ALICE, BOB, NICK)
flatmap:flat即扁平化,效果就是将集合中的每个元素的子元素映射到某个函数并返回新的集合。
举例:
val names = List("Alice","Bob","Nick")
val names2 = names.flatMap(_.toUpperCase())
println(names2)
打印:List(A, L, I, C, E, B, O, B, N, I, C, K)
filter:将符合要求的数据(筛选)放置到新的集合中
举例:筛选首字母为“A”
val names = List("Alice","Bob","Nick")
val names2 = names.filter(_.startsWith("A"))
println(names2)
打印:List(Alice)
调用reduce()、reduceLeft()、reduceRight()方法,reduce和 reduceLeft都是从左边开始,每两个元素调用一次函数,并将返回值与下一个元素组成一个实参组合进而调用函数。reduceRight从右边开始计算,需要特别注意计算顺序。
举例
val list = List(1,2,3,4,5)
val n = list.reduceLeft((n1:Int,n2:Int)=>n1-n2)
println(n) // 打印 -13
val n2 = list.reduceRight((_-_)) //_-_ 为简写
println(n2) //打印 3
//计算过程 4-5 ,3-(-1),2-4,1-(-2)
(z:B)为初始值,作为左侧第一个数参与运算
val list = List(1,2,3,4,5)
val sum = list.fold(0)(_+_)
println(sum) //打印 15
//测试二 右侧
val list = List(1,2,3,4,5)
def aa(n1:Int,n2:Int):Int ={
print(n1+"-----"+n2+" ")
n1-n2
}
val n = list.foldRight(1)(aa)
println(n)
//打印
5-----1 4-----4 3-----0 2-----3 1------1
2
对元素的处理方式和fold相同,不同在于scan将每次调用函数产生的中间结果保存在一个集合中,而fold只返回最后结果。
举例
val n = (1 to 3).scanLeft(3)(_*_)
println(n)
//打印 Vector(3, 3, 6, 18)