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

 

posted @ 2016-04-14 16:19  踏雪苍龙  阅读(122)  评论(0)    收藏  举报