String

前文已经说明了字符串的声明方式:

var s = "Hello World";
var s: String = "Hello World";

在 Scala 中,字符串的类型实际上是 Java String(java.lang.String),它本身没有 String 类。我们可以在Scala中使用Java String的所有方法。

String对象是不可变对象, 更改String内容的操作实际上是创建了一个新的字符串。

scala> var s = "Hello";
res: s: String = Hello scala> s.charAt(0);
res: Char = H scala> s.length();
res: Int = 5 scala> var f = "%s, %d";
f: String = %s, %d scala> f.format("Hello", 1);
res: String = Hello, 1 scala> s + f;
res: String = Hello%s, %d

若需要创建一个可以修改的字符串,可以使用 String Builder 类:

scala> var sb = new StringBuilder();
sb: StringBuilder = scala> sb ++= "Hello" // ++= for string
res: StringBuilder = Hello scala> sb += ',' // += for char
res: StringBuilder = Hello, scala> println(sb)
Hello, scala> println(sb.toString)
Hello,

Array

Array是scala内置的数组类型,用于线性存储同类型对象, 其长度不可变, 实际上是Java Array。

scala> var arr = new Array[Int](3)
arr: Array[Int] = Array(0, 0, 0) scala> var arr = Array("Hello", "World") // do not use `new`
arr: Array[String] = Array(Hello, World) scala> var arr = Array.range(1,3) // range(satrt, stop, step)
arr: Array[Int] = Array(1, 2) scala> var dim = Array.ofDim[Int](3, 3) // multi dim array
arr: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0))

scala使用圆括号而非方括号访问数组元素, 下标从0开始:

scala> arr(0)
res: Int = 0 scala> arr(0) = 1
scala> arr(0)
res: Int = 1 scala> dim(0)(1)
res: Int = 0

ArrayBuffer

ArrayBuffer是scala提供的变长数组, 使用前需要先进行引入:

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer scala> var ab = new ArrayBuffer[Int]()
ab: ArrayBuffer[Int] = ArrayBuffer() scala> var ab = ArrayBuffer(1,2,3,4)
ab: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)

ArrayBuffer的初始化与操作与Array很像。

scala> ab(1)
res: Int = 2 scala> ab(1) = 3 scala> ab(1)
res: Int = 3

变长数组ArrayBuffer可以任意添加删除元素:

scala> ab
res: ArrayBuffer[Int] = ArrayBuffer(1, 2) scala> ab += 3 // append element
res: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3) scala> ab += (4, 5) // use tuple append several elements
res: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5) scala> ab ++= Array(6, 7) // use array append several elements
res: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7) scala> ab ++= List(8, 9) // use list append several elements
res: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)

insert方法可以在任意位置插入元素:

scala> ab.insert(0,0)  // insert 0 at index 0
res: ArrayBuffer[Int] = ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) scala> ab.insert(1, 3, 4, 5) // insert several elements
res: ArrayBuffer[Int] = ArrayBuffer(0, 3, 4, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9)

remove(index)方法可以移除指定位置的单个元素并返回被移除元素的值.

remove(start, len) 方法可以移除从start位置开始的len个元素, 即下标在范围内[start, start+len]的元素。

scala> ab.remove(0)  // remove element, `remove` will return the element
res: Int = 0
scala> ab
res: ArrayBuffer[Int] = ArrayBuffer(3, 4, 5, 1, 2, 3, 4, 5, 6, 7, 8, 9) scala> ab.remove(0, 3)
res: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)

Array与ArrayBuffer之间可以互相转换:

scala> ab.toArray
res: Array[Int] = Array(1, 2, 3, 4) scala> arr.toBuffer
res: Buffer[Int] = ArrayBuffer(1, 2, 3, 4)

List

List是scala中的另一个线性容器,其数据结构为广义表。List是线性存储同类型对象的定长容器,其元素不可改变。

List也可以用构造函数或字面值初始化:

scala> var l1 = List(1,2,3)
l: List[Int] = List(1, 2, 3) scala> var l2 = 4::5::6::Nil
l: List[Int] = List(4, 5, 6) scala> var l = List.range(1,4)
l: List[Int] = List(1, 2, 3)

Nil是scala的保留字代表一个空List, 这里可以暂时理解为结尾标记。待下文说明List的广义表结构和::运算符之后,我们就会更深入地理解第二种初始化方式。

List的操作与Array类似, 但是元素无法更改:

scala> l1(1)
res: Int = 2 scala> l1.length
res: Int = 3 scala> l1.isEmpty
res: Boolean = false scala> l1(2) = 2
<console>: error: value update is not a member of List[Int]

List提供了广义表的head和tail操作, head操作返回List的第一个元素,返回从第二个元素到最后一个元素组成的列表。

scala> l1.head
res: Int = 1 scala> l1.tail
res: List[Int] = List(2, 3)

每一个List都可以看做由head和tail两部分组成, head::tail即是将head和tail组装为List的运算符. ::在tail为单个元素e时, 将其作为List(e)处理.

而运算符:::用于连接两个List.

scala> l1 :: l2
res: List[Any] = List(List(1, 2, 3), 4, 5, 6) scala> l1:::l2
res: List[Int] = List(1, 2, 3, 4, 5, 6) scala> Nil
res: scala.collection.immutable.Nil.type = List()

List可以与其他线性容器相互转换:

scala> l.toString()
res: String = List(1, 2, 3) scala> l.toArray
res: Array[Int] = Array(1, 2, 3) scala> l.toBuffer
res: Buffer[Int] = ArrayBuffer(1, 2, 3)

Tuple

元组(tuple)与List类似同为不可变线性容器, 元组的特点在于它可以容纳不同类型的元素。

元组可以使用圆括号字面值创建:

scala> var tu = (1, "Hello", 2.0)
tu: (Int, String, Double) = (1,Hello,2.0)

访问tuple元素的方法比较独特:

scala> tu._1
res: Int = 1 scala> tu._2
res: String = Hello scala> tu._3
res: Double = 2.0

Set

集合(Set)是不允许元素重复的无序的容器, scala中的集合默认为不可变集合scala.collection.immutable.Set, 若需要使用可变集合需要手动引入scala.collection.mutable.Set.

可变与不可变集合均实现了添加删除元素以及合并集合等操作, 只不过不可变集合执行此类操作时创建了一个新的集合,而可变集合改变了自身。

scala> var s = Set(1,2,3)
s: Set[Int] = Set(1, 2, 3) scala> s(0) // if `0` in s then return true else return false
res: Boolean = false scala> s(1)
res: Boolean = true scala> s = s + 4 // add a new element to a set
s: Set[Int] = Set(1, 2, 3, 4) scala> s = s - 4 // remove an element from a set
s: Set[Int] = Set(1, 2, 3)

上述Set的运算符均有对应的复合赋值运算符, 如+=添加元素.

scala也提供了一些集合之间的运算, 包括交集,并集和差集:

scala> var s2 = Set(2, 3, 4)
s2: Set[Int] = Set(2, 3, 4) scala> s & s2 // intersect
res: Set[Int] = Set(2, 3) scala> s | s2 // union
res: Set[Int] = Set(1, 2, 3, 4) scala> s &~ s2 // difference
res: Set[Int] = Set(1)

Map

映射(Map)是存储键值对的无序容器,Map中的键都是唯一的其某些特性与Set类似。

Scala同样拥有可变Map和不可变Map,默认引入的是不可变Map, 若需使用可变Map可以自行导入。

scala实现了Map的常用操作:

scala> var m = Map("one"->1, "two"->2)
m: Map[String,Int] = Map(one -> 1, two -> 2) scala> m.contains("three") // check whether a key contains
res: Boolean = false scala> m("one") // get value from key
res: Int = 1 scala> "three" -> 3 // make a key-value pair
res: (String, Int) = (three,3) scala> m += ("three" -> 3) // add a key-value pair
m: Map[String,Int] = Map(one -> 1, two -> 2, three -> 3) scala> m ++= Map("four"->4) // ++ for map
m: Map[String,Int] = Map(one -> 1, three -> 3, four -> 4) scala> m -= "two" // remove a key-value pair
m: Map[String,Int] = Map(one -> 1, three -> 3)

上述复合运算符均有对应的算术运算符, 如m - "two"移除键值对.

我们也可以访问Map的keys和values集合:

scala> m.keys
res: Iterable[String] = Set(one, three) scala> m.values
res: Iterable[Int] = MapLike.DefaultValuesIterable(1, 3)

Scala字符串与容器的更多相关文章

  1. Scala:字符串

    http://blog.csdn.net/pipisorry/article/details/52902348 Scala字符串 在 Scala 中,字符串的类型实际上是 Java String,它本 ...

  2. Spark记录-Scala字符串

    Scala字符串 在Scala中的字符串和Java中的一样,字符串是一个不可变的对象,也就是一个不能修改的对象.可以修改的对象,如数组,称为可变对象.字符串是非常有用的对象,在本节的最后部分,我们将介 ...

  3. scala字符串前加s使用$

    https://my.oschina.net/u/2000675/blog/1592140 字符串中的变量替换,Scala中基础的字符串插值就是在字符串前加字幕‘s’,然后在字符串中放入变量,每个变量 ...

  4. Java字符串和容器

    String Java.lang.String是Java的字符串类. Srting是一个不可变对象,所有对String修改的操作都需要构造新的String实例. String可以由char数组或字符串 ...

  5. Scala字符串插值

    Scala提供了三种字符串插值方式:s,f和raw.1. s字符串插值器简单的说就是解析字符串变量. val name = "Tom" println(s"His nam ...

  6. learning scala 数组和容器

    数组:可变的,可索引的,元素具有相同类型的数据集合 一维数组 scala> val intValueArr = new Array[Int](3)intValueArr: Array[Int] ...

  7. Python字符串与容器

    []运算符是Python中访问容器元素和切片的运算符 []有正向和反向两种下标,正向下标从0开始,向后递增: 反向下标以-1表示最后一个元素,-2表示倒数第二个字符,向前递减. []不仅可以访问单个元 ...

  8. Scala字符串插值 - StringContext

    翻译自:STRING INTERPOLATION 简介 自2.10.0版本开始,Scala提供了一种新的机制来根据数据生成字符串:字符串插值.字符串插值允许使用者将变量引用直接插入处理过的字面字符中. ...

  9. Scala 字符串插值器

    Scala 提供了三种创新的字符串插值方法:s,f和raw,使用他们我们可以方便快捷的组合字符串. s 字符串插值器 在任何字符串前加上s,就可以直接在串中使用变量了,在生成字符串的时候会隐式调用其t ...

随机推荐

  1. Samba简介与配置(匿名&本地用户验证)

    Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 在此之前我们已经了解了NFS,NFS与samba一样,也是在网络中实现文件共享的一种实 ...

  2. VBA找相似体积的单元格值

    在VBA中做了一个比较体积,如果体积相似就显示隔壁单元格的内容 Function VC(a, b As Range) 'VolumeCompare体积比较 Dim arry() As Variant ...

  3. TensorFlow --playground游乐场

    TensorFlow游乐场官网http://playground.tensorflow.org(国内需要梯子才能访问) 游乐场的神经网络结构有三层,第一层为输入层,输入的是特征向量(描述问题特征的向量 ...

  4. 【慕课网实战】一、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    课程整套CDH相关的软件下载地址:http://archive.cloudera.com/cdh5/cdh/5/ cdh-5.7.0 生产或者测试环境选择对应CDH版本时,一定要采用尾号是一样的版本 ...

  5. android-基础编程-ScrollView

    滚动视图(ScrollView)是指当拥有很多内容,屏幕显示不完时,需要通过滚动来显示完整的视图.包括水平滚动视图(HorizontalScrollView)和垂直滚动视图(ScrollView) 基 ...

  6. EBS CAS SSO测试

    https://wiki.jasig.org/display/CAS/CASifying+Oracle+Portal https://wenku.baidu.com/view/5f110a85b9d5 ...

  7. 为什么需要micro-service构建平台

    最近一直在做micro-service的开发平台建设.由于这是一个实验项目,目前所有工作都得靠自己操刀. 今天在总结用python开发一个web service时,偶有所得,这让我建设micro-se ...

  8. Django _VIEW视图_源码分析

    Django _VIEW视图: 1. 点击as_view方法. 第二步: as_view () 为VIEW 类里定义的,到时候我们定义业务逻辑的类就继承这个VIEW类. view方法内返回的是disp ...

  9. HashMap的源码分析

    hashMap的底层实现是 数组+链表 的数据结构,数组是一个Entry<K,V>[] 的键值对对象数组,在数组的每个索引上存储的是包含Entry的节点对象,每个Entry对象是一个单链表 ...

  10. 纯css实现不同方向的三角形

    .triangle { position: relative; &:after { position: absolute; top: 50%; transform: translate(0,- ...