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" -> ) //不可变映射

因为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(,)

digits.head //

digits.tail// List(2)

digits.tail.head//

digits.tail.tail //Nil

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

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

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

 :: (  :: ( :: Nil ) )

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

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

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

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

  case Nil => 

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

}

直接使用List的方法

List(,,).sum

可变列表

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

DoubleLinkedList多带一个prev

val lst = scala.collection.mutable.LinkedList(,-,,-)

var cur = lst

while(cur != Nil){

  if(cur.elem<) cur.elem = 

  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)

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

val weekdays = scala.collection.mutable.LinkedHashSet(,,,)

排序的集

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

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

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

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

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

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

val digits = Set(,,,)

digits contains  // false

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

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

val primes = Set(, , , )

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

digits & primes // Set (2,7)

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

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

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

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

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

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

val numbers = ArrayBuffer(,,)

numbers +=  // 将 5 添加到 numbers

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

var numbers = Set(,,)

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

var numberVector = Vector(,,)

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

移除元素

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

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

col1 ++ col2 

Scala集合(一)的更多相关文章

  1. Scala集合操作

    大数据技术是数据的集合以及对数据集合的操作技术的统称,具体来说: 1.数据集合:会涉及数据的搜集.存储等,搜集会有很多技术,存储技术现在比较经典方案是使用Hadoop,不过也很多方案采用Kafka.  ...

  2. Spark:scala集合转化为DS/DF

    scala集合转化为DS/DF case class TestPerson(name: String, age: Long, salary: Double) val tom = TestPerson( ...

  3. Scala集合常用方法解析

    Java 集合 : 数据的容器,可以在内部容纳数据  List : 有序,可重复的  Set : 无序,不可重复  Map : 无序,存储K-V键值对,key不可重复 scala 集合 : 可变集合( ...

  4. Scala集合笔记

    Scala的集合框架类比Java提供了更多的一些方便的api,使得使用scala编程时代码变得非常精简,尤其是在Spark中,很多功能都是由scala的这些api构成的,所以,了解这些方法的使用,将更 ...

  5. Scala集合类型详解

    Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...

  6. 再谈Scala集合

    集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下. 本文原文出处:  还是先上张图吧,这是我 ...

  7. Spark记录-Scala集合

    Scala列表 Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别. 首先,列表是不可变的,列表的元素不能通过赋值来更改. 其次,列表表示一个链表,而数组是平的. 具有类 ...

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

    今天在业务开发中遇到需要Scala集合转为Java集合的场景: 因为业务全部是由Scala开发,但是也避免不了调用Java方法的场景,所以将此记录下来加深记忆: import scala.collec ...

  9. Scala集合学习总结

    遍历集合可以使用迭代器iterator的那套迭代方式.Seq是一个有先后次序的序列,比如数组或列表.IndexedSeq可以通过下标进行任意元素的访问.例如ArrrayBuffer. Set是一组没有 ...

随机推荐

  1. Kubernetes部署SpringCloud(二) 部署ZUUL与服务 非host, 伸缩与负载均衡

    因为服务需要可缩容,所以不能使用host部署. 涉及两个应用,zuul,basic-info-api 验证,在k8s任意一个node 从zuul 访问 basic-info-api 创建一个Sprin ...

  2. 7.15python进程锁

    #!/usr/bin/env python #!--*--coding:utf-8 --*-- #!@Time :2018/7/14 17:33 #!@Author TrueNewBee #锁 # 火 ...

  3. linux 下修改键盘映射

    参考文档 原因: 输入 键盘原本的 “\ |”,结果映射到 "< >",而 < 与 > 对应的键名分别是 less 与 greater 查看键名: xev ...

  4. Spark RDD 默认分区数量 - repartitions和coalesce异同

    RDD.getNumPartitions()方法可以获得一个RDD分区数量, 1.默认由文件读取的话,本地文件会进行shuffle,hdfs文件默认会按照dfs分片来设定. 2.计算生成后,默认会按照 ...

  5. Android Studio 工具窗口浮动与布局恢复【申明:来源于网络】

    Android Studio 工具窗口浮动与布局恢复[申明:来源于网络] http://bbs.chinaunix.net/thread-4182438-1-1.html

  6. SQL中的between and

    "between xx and  xx "在SQL中的用法 这个大家都很熟悉,但是当问到是否包含两端的值时,就有点儿不确定了.在W3School网站上,有这样的一段话: 参考:ht ...

  7. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  8. [No0000139]轻量级文本编辑器,Notepad最佳替代品:Notepad++

    在详细介绍Notepad++之前,先来解释一下,为何要选择Notepad++,即把常见的一些文本编辑器和Notepad++比较,看看其有哪点好: 常见的文本编辑器有很多,此处,只提及Notepad,N ...

  9. hive优化之并行执行任务

    1.与Oracle并行技术一样,hive在执行mapreduce作业时也可以执行并行查询.针对于不同业务场景SQL语句的执行情况,有些场景下SQL的执行是需要分割成几段去执行的,而且期间并不全是存在依 ...

  10. 一些shell默认的变量

    测试脚本如下,我这里主要想测试$0,$1,$2,$n,$@,$*默认都代表了什么? #!/bin/sh echo '$1='$1 echo '$2='$2 echo '$@='$@ echo '$*= ...