Scala集合(一)

Scala集合的主要特质

Iterator,用来访问集合中所有元素

val coll = ... // 某种Iterable

val iter = col.iterator

while(iter.hasNext)

  iter.next()

Seq是一个有先后次序的值得序列,比如数组或列表。
IndexSeq允许我们通过整型的下标快速访问任意元素,如ArrayBuffer是带下标的。
Set是一组没有先后次序的值,在SortedSet中,元素以某种排过序的顺序被访问。
Map是一组(K,V)对偶,SortedMap按照键的排序访问。

每个Scala集合特质或类,都有一个带有apply方法的伴生对象,这个apply方法可以用来构建该集合中的实例。

Iterable(0xFF, 0xFF00, 0xFF0000)

set(color.RED, color.GREEN, Color.BLUE)

Map(color.RED -> -0xFF0000, Color.GREEN -> 0xFF00, Color.BLUE -> 0xFF)

SortedSet("Hello" , "World")

可变和不可变集合

scala.collection.mutable.Map    //可变

scala.collection.immutable.Map //不可变 

scala.collection.Map //超类

Scala优先采用不可变集合, scala.collection 包中的伴生对象产出不可变的集合

scala.collection.Map("Hello" -> 42) //不可变映射

因为Scala包和Predef对象总是被引入,他们都指向不可变特质的类型别名List、Set和Map.

Preedef.Map和scala.collection.immutable.Map是一回事

import scala.collection.mutable

用Map得到不可变,用mutable.Map得到可变的。

序列

Vector是ArrayBuffer的不可变版本,一个带下标的序列,支持快捷的随机访问,以树形结构的形式实现。

Range表示一个整数序列,只存储起始值,结束值和增值, 用 to 和 until 方法来构造Range对象。

列表

列表要么是Nil(空表),要么是一个head元素和一个tail,tail又是一个列表。

val digits = List(4,2)

digits.head //4

digits.tail// List(2)

digits.tail.head// 2

digits.tail.tail //Nil

:: 操作符从给定的头和尾创建一个新的列表。

9 :: List(4,2) // List(9,4,2)

9 :: 4 :: 2 :: Nil  // :: 是右结合,列表从末端开始构建

9 :: ( 4 :: (2 :: Nil ) )

迭代, 除了遍历外,可以用 递归 模式匹配

def sum(lst : List[Int]): Int = 

  if( lst == Nil) 0 else lst.head + sum(lst.tail)

def sum(lst:List[Int]): Int = lst match{

  case Nil => 0

  case h :: t => h+sum(t) // h 是 lst.head, 而t是lst.tail, ::将列表“析构”成头部和尾部

}

直接使用List的方法

List(9,4,2).sum

可变列表

LinkedList, elem指向当前值,next指向下一个元素

DoubleLinkedList多带一个prev

val lst = scala.collection.mutable.LinkedList(1,-2,7,-9)

var cur = lst

while(cur != Nil){

  if(cur.elem<0) cur.elem = 0

  cur = cur.next

} // (1,0,7,0) ,将所有负值改为0

var cur = lst 

while(cur != Nil && cur.next != Nil){

  cur.next = cur.next.next

  cur = cur.next

}// 去除每两个元素中的一个

注:当要把某个节点变为列表中的最后一个节点,不能将next 设为Nil 或 null, 而将它设为LinkedList.empty。

不重复元素的集合,以哈希集实现,元素根据hashCode方法的值进行组织

Set(2,0,1) + 1 // (2,0,1)

LinkedHashSet,链式哈希集 记住元素被插入的顺序

val weekdays = scala.collection.mutable.LinkedHashSet(1,2,3,4)

排序的集

scala.collection.immutable.SortedSet(1,2,3,4) // 用红黑树实现的

Scala 2.9没有可变的已排序集,用java.util.TreeSet

位集(bit set), 以一个字位序列的方式存放非负整数,如果集中有i,则第i个字位是1

高效的实现,只要最大元素不是特别大。

Scala提供 可变和不可变的两个 BitSet类

contains 检查是否包含, subsetOf 检查集的所有元素是否被另一个集包含

val digits = Set(1,7,2,9)

digits contains 0 // false

Set(1,2) subsetOf digits // true
union intersect diff 方法,也可写作| ,&, &~

union 还可以写成 ++, diff 写作 --

val primes = Set(2, 3, 5, 7)

digits union primes // Set(1,2,3,5,7,9)

digits & primes // Set (2,7)

digits -- primes // Set(1,9)

一般而言,+用于将元素添加到无先后次序的集合,而+:和:+则是将元素添加到有先后次序的集合的开头或末尾。

Vector(1,2,3) :+ 5 //Vector(1,2,3,5)

1 +: Vector(1,2,3) //Vector(1,1,2,3) 

以冒号结尾的操作符,+:是右结合的,这些操作符都返回新的集合

可变集合有 +=操作符 用于修改左侧操作元

val numbers = ArrayBuffer(1,2,3)

numbers += 5 // 将 5 添加到 numbers

不可变集合,可以在var上使用+=或:+=

var numbers = Set(1,2,3)

numbers += 5 // numbers 设为不可变的集numbers + 5

var numberVector = Vector(1,2,3)

numbersVector :+= 5 // 向量没有+操作符,只有:+

移除元素

Set(1,2,3) -2 // Set(1,3)

++来一次添加多个元素, -- 一次移除多个元素

col1 ++ col2 

原文地址:https://www.cnblogs.com/itboys/p/10281429.html

时间: 2024-10-05 04:56:12

Scala集合(一)的相关文章

scala集合类型与java的转换

scala集合与java集合类型相互转换: http://www.scala-lang.org/api/current/index.html#scala.collection.JavaConverters$ 您可以通过JavaConverters package轻松地在Java和Scala的集合类型之间转换.它用asScala 装饰常用的Java集合以和用asJava 方法装饰Scala集合.    import scala.collection.JavaConverters._    val 

Spark:scala集合转化为DS/DF

scala集合转化为DS/DF 1 case class TestPerson(name: String, age: Long, salary: Double) 2 val tom = TestPerson("Tom Hanks",37,35.5) 3 val sam = TestPerson("Sam Smith",40,40.5) 4 val PersonList = mutable.MutableList[TestPerson]() 5 PersonList

Scala集合笔记

Scala的集合框架类比Java提供了更多的一些方便的api,使得使用scala编程时代码变得非常精简,尤其是在Spark中,很多功能都是由scala的这些api构成的,所以,了解这些方法的使用,将更加有助于我们学习Scala和Spark: List,Map,Set的一些api的用法如下:  Java代码   /** * Scala 集合测试 */ def collectionTest(): Unit ={ val map =Map("red"->"红色",&

再谈Scala集合

集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下. 本文原文出处:  还是先上张图吧,这是我找到的最好的一个关于Scala集合的图了,出自:http://lkumarjain.blogspot.co.id/2015/01/scala-collection-framework.html : 一致的构建风格 在Scala里我们使用一致的简洁的语法实例化一个集合,不管你使用的是一个Trait还是

Scala集合类型详解

Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类永远不会改变.不过,你仍然可以模拟添加,移除或更新操作.但是这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变. 集合中基本结构: 几种常用集合类型示例: // 定义整型 List   val x = List(1, 2, 3, 4)     // 定义 S

Scala集合学习总结

遍历集合可以使用迭代器iterator的那套迭代方式.Seq是一个有先后次序的序列,比如数组或列表.IndexedSeq可以通过下标进行任意元素的访问.例如ArrrayBuffer. Set是一组没有先后次序的值,在SortedSet中,元素以某种排过序的顺序被访问. Map是一组(键,值)对偶,SortedMap按照键的顺序访问实体 Scala集合有三个基本操作: head 返回集合第一个元素 tail 返回一个集合,包含除了第一元素之外的其他元素 isEmpty 在集合为空时返回true 可

scala集合与java集合的转换应用

今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collection.JavaConverters._ //需要导入这个包 val javaRequest: java.util.List[TAddShopRequest] = request.asJava//将Scala集合转为Java集合当作参数传入addShop方法 val res: DadaApiRes

scala 高级十六 scala 集合和集合的高级特性 map flatten fllatmap zip reduce zip 等操作

1. scala 的列表List 和集Set 的操作 //Set 和list 差不多,不过 Set 中不允许有重复的元素   var set=scala.collection.mutable.Set[Int]();        //+ 会产生一个新的对象,而不是在set 中动态增加    set.+(1)    //+= 会在原先的set 中动态的增加元素而不是产生一个新的对象.    set.+=(1,2,3)        //这个会输出一个排序以后的 集合 比如 输入 7,4,8,6,1

[Scala基础系列 07]Scala集合

Scala有一个非常通用,丰富,强大,可组合的集合库:集合是高阶的(high level)并暴露了一大套操作方法.很多集合的处理和转换可以被表达的简洁又可读,但不审慎地用它们的功能也会导致相反的结果.每个Scala程序员应该阅读 集合设计文档:通过它可以很好地洞察集合库,并了解设计动机. 1.数组(Array&ArrayBuffer) 1.1.Array 数组(Array)其实并不在scala.collection包里面,它属于scala包,直接对应于Java的数组,比如,Scala中的Arra