Scala学习之二 --- 数据结构与控制结构
scala中也有其中数值类型:Byte,Char,Short,Int,Long,Float和Double,以及Boolean类型。与java不同的是,这些类型是类级。
数值类型的使用和java类似,故不做过多介绍。下面着重总结一下常用的数据类型:
1. 字符串--String
Scala中String类型和java中一样,属于不变对象。
常用方法如下:
scala> val str = "hello" + " world"
res0: String = "hello world"
2. 数组--Array
关于数组的要点如下:
1) 若长度固定用Array,长度不固定用ArrayBuffer
2) 提供初始值时不需要new关键字
3) 用()通过下标来访问其中的元素,而java中是通过[]
如果需要一个长度不变的数组,可以用Array:
// 10个整数的数组,所有元素初始化为0 val nums = new Array[Int](10) // 10个元素的字符串数组,所有元素初始化为null val a = new Array[String](10) // 提供初始值时不需要new关键字 val str = Array("Hello", "World") // 为数字第一个元素重新赋值,用()而不是[]来访问数组元素 str(0) = "GoodBye"
在jvm中,Scala的Array以java数组的方式实现。即,示例中的字符串数组在jvm中的类型为java.lang.String[].
而Int,Double或其他与java中基本类型对应的数组都是基本类型数组。
对于长度需要在需要时改变的数组,在java中可以使用ArrayList,Scala中与之等效的是ArrayBuffer:
import scala.collection.mutable.ArrayBuffer // 此处可以省略new关键字 // 一个空的数组缓冲,用来存放整数 val b = ArrayBuffer[Int]() // 在尾端添加单个元素 b += 1 //在尾端添加多个元素,以括号括起来 b += (2,4,8) // 可以用 ++= 在尾端追加任何集合 b ++= Array(3,6,9) // 从尾端移除5个元素,从数组缓冲的尾端添加或移除元素是一个高效的操作 b.trimEnd(5) // 在下标2之前插入 b.insert(2,6) // 可以插入任意多的元素 b.insert(2,8,9,10) // 和insert的意义类似,remove的操作 b.remove(2) // 从下标2开始移除元素的个数 b.remove(2,3) // 可以把数组缓冲转变为一个数组,只需要调用 b.toArray
我们可以用for循环便利数组或数组缓冲:
// Range(0,1,2,3,4,5,6,7,8,9) 0 until 10 // 遍历数组方法一 for ( i <- 0 until a.length) println(i + ":" + a(i))
3. 列表 -- List
val fruit: List[String] = List("apples", "oranges", "pears") val empty: List[Nothing] = List() val dim2: List[List[Int]]= List( List(1,0,0), List(0,1,0), List(0,0,1) ) // List的常用方法/函数 val nums: List[Int] = List(2,4,6,8,-2,-4,-6,10,11) val nums2 = 2 +: nums // 将元素前置与指定列表 val nums3 = nums2.distinct // 去除列表中重复的元素 val nums4 = nums2.drop(2) //移除前2个元素 val nums5 = nums2.dropRight(4) val nums6 = nums2.dropWhile((x: Int) => x > 5) val nums7 = nums2.takeWhile((x: Int) => x > 5)
val fruit2 = "apples" :: "oranges" :: "pears" :: Nil
val num2 = List(1,2,4) ::: List(5,6,8) // 拼接两个List
val headNum = num2.head //返回列表第一个元素
val tailNum = num2.tail //返回一个除了第一个元素外的所有元素列表
val flag = num2.isEmpty //验证列表是否为空
val reverseNum = num2.reverse //倒排列表元素
val intList = List.fill(4)(8) // 给列表填充元素 //把指定元素的前几个元素应用到指定函数上
val squares = List.tabulate(6)(n => n * n) // List(0, 1, 4, 9, 16, 25)
// 第一个参数为列表的尺寸,第二个参数描述列表的元素
// 将指定元素的前几个元素依次以其中元素为(下例为乘数)应用到列表上
val mul = List.tabulate(4, 5)(_ * _) println(mul) //List(List(0, 0, 0, 0, 0),
List(0, 1, 2, 3, 4),
List(0, 2, 4, 6, 8),
List(0, 3, 6, 9, 12))
// def copyToArray(xs: Array[A], start: Int, len: Int):Unit // 从指定位置开始,填充给定数组xs
for ( i <- List.range(1, 5); j <- List.range(1, i)) yield (i, j)
List(1, 2, 3, 4, 5) find (_ % 2 == 0) //Some(2)
List(1, 2, 3, 4, 5) find (_ <= 0) // None
List(1, 2, 3, 4, 5) partition ( _ % 2 == 0) // (List(2,4),List(1,3,5))
List(1, 2, 3, 4, 5) filter (_ % 2 == 0) //将集合在第一个不满足条件的元素处进行分割,类似于splitAt
List(1,2,3,-4,5) span (_ > 0) // 找出以列表的列表形式表达的矩阵是否有全零行元素
def hasZeroRow(m: List[List[Int]])= m exists (row => row forall (_ == 0))
//列表排序 List(1, -3, 4, 2, 8).sorted //对现有列表排序,返回值为None
List(1, -3, 4, 2, 8) sortWith ((a, b) => a > b) //提供排序的规则,返回排序后的列表
List.range(1,5)
List.range(9, 1, 2)
val lst = List(List(1,2,3),List("a","b","c"))
val lst2 = lst.flatten // List(1,2,3,a,b,c)
val zipped = List("a","b","c") zip List(1,2,3) //List((a,1), (b,2), (c,3))
val unzipped = zipped.unzip // (List(a,b,c),List(1,2,3))
4. 集 --- Set
val nums = Set(1, 2, 3) println(nums + 5) // Set(1, 2, 3, 5) println(nums -3) // Set(1, 2) println(nums ++ List(5, 6)) // Set(5, 1, 6, 2, 3) println(nums -- List(1, 3)) // Set(2) println(nums intersect Set(1,2,3,5,6,7,8)) //获得交集 ** 弃用 println(nums.size) // 集中包含的对象的数量 nums.contains(3) // 是否包含某元素 val words = mutable.Set.empty[String] //创建可变空集 words += "the" words -= "the" words ++= List("do", "re", "mi") words --= List("do", "re") words.clear // 清空集
5. 元组 --- Tuple
val t = (1, 3.14, "Jack") val sec = t._2 val s = (t._2, t._1) //将t中前两个元素调换位置组成新的元组 //匹配模式 val (first, second, third) = t //分别匹配t中的三个元素
6. 映射 --- Map
val nums0 = Map("i" -> 1, "ii" -> 2) nums0 + ("vi" -> 6) nums0 - "ii" nums0 ++ List("iii" -> 3, "v" -> 5) nums0 -- List("i", "ii") nums0.size nums0.contains("ii") nums0("ii") nums0.keys // 返回键枚举器 nums0.keySet // 返回键集 nums0.values // 返回值枚举器 nums0.isEmpty // map是否为空 val words0 = scala.collection.mutable.Map.empty[String, Int] // 创建空可变映射 words0 += ("one" -> 1) words0 -= "one" words0 ++= List("one" -> 1, "two" -> 2, "three" -> 3) words0 --= List("one", "two") // 有序集合映射,Scala的集合库提供了SortedSet和SortedMap特质, //这两个特质分别由类TreeSet和TreeMap实现,其顺序取决于Ordered特质,这些类只有可变类型 val ts = scala.collection.mutable.TreeSet(9, 3, 4, 2, 6, 8, 1) println(ts) // TreeSet(1, 2, 3, 4, 6, 8, 9) // TreeMap只有不可变类型 var tm = scala.collection.immutable.TreeMap(3 -> 'x', 1 -> 'x', 4 -> 'x') println(tm) // Map(1 -> x, 3 -> x, 4 -> x) tm += (2 -> 'x')
同步的集和映射已废弃。
Scala支持元组、数组与列表之间的简易转换:
// 元组、数组与列表之间的转换 val strs = mutable.TreeSet("one", "two", "three") println(strs.toList) // List(one, three, two) println(strs.toArray) // [Ljava.lang.String;@4566e5bd

浙公网安备 33010602011771号