Scala集合入门学习

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

  • 可变和不可变的集合

Scala同时支持可变的和不可变的集合,不可变的集合从不改变,因此不可变集合是线程安全的集合.
例如有:scala.collection.mutable.Map,也有scala.collection.immutable.Map。它们有一个共有的超类型scala.collection.Map 默认情况下Scala优先采用不可变集合。scala.collection包中的伴生对象产出不可变的集合例如:scala.collection.Map("hello" -> 42)是一个不可变的映射。

  • 添加元素和移除元素的操作符
  1. 向后(:+)或向前(+:)追加元素到序列当中
  2. 添加(+)元素到无先后次序的集合中
  3. 用-移除元素
  4. 用++和–来批量添加和移除元素
  5. 对于列表优先使用::和:::
  6. 改值操作有+=,++=,-=,–=
  7. 对于集合,使用++,&和–
  8. 尽量不用++:,+=:和++=:
  def main(args: Array[String]): Unit = {
    // 初始化构建元素个数为4的集合对象
    val v = Vector(1, 2, 3, 4)
    // 添加集合后添加5(新建集合添加5)
    println(v :+ 5)
    // 集合前添加0(新建集合添加0)
    println(5 +: v)
    // 初始化构建高效数组缓存
    val array = ArrayBuffer(1, 2, 3, 4)
    // 添加元素5
    println(array += 5)
    // 删除元素1
    println(array -= 1)
    // 初始化Set集合对象
    val number = Set(1, 2, 3)
    // 添加4元素(新建set集合添加4)
    println(number + 4)
    // 添加4元素(新建set集合移除3)
    println(number - 3)
    // 使用++添加多个set元素(结果为无序的)
    println(number ++ Set(4, 5, 6))
  }
}
可以使用++一次添加多个元素,也可以使用--一次删除多个元素
  • 将函数映射到集合
    有时候可以对元素进行变换,map方法可以将某个函数应用到集合每个元素并进行相应的元素处理
    // 初始化创建List集合映射map
    val name = List("Bob", "Michael", "Marry")
    println(name.map(_.toUpperCase))
    val result = for (n <- name) yield n.toUpperCase
    println(result)
    // 拼接字符串
    def unclase(string: String) = Vector(string.toLowerCase(), string.toUpperCase())
    println(name.flatMap(unclase))
  • 集合转换

import scala.collection.JavaConversions._ 需要手动导入这个类,如果没有导入,idea编辑器编译器会报错。这里主要的功能是将java的集合转为scala的集合。如将java的Map和List集合可以转化为Scala对应的Map与List集合,转化后就可以使用scala的常用的集合操作了。下面以Java的list和map为例:

// 创建java的HashMap
val javaMap =  new java.util.HashMap[String, String]()
javaMap.put("userId","201905140007")
// 将java的Map集合转为Scala的Map
val scalaMap = javaMap.toMap

// 创建Java的ArrayList
val javaList = new java.util.ArrayList[String]
javaList.add("hello java")
// 将java的List转为Scala的List
val scalaList = javaList.toList

import scala.collection.JavaConverters._ 同样需要手动导入这个类。这个类的主要功能就是将scala的集合转为java的List。

// 创建scala的list
val list = List("1","2","3")
// 转换后的java的ArrayList
val javaList = list.asJava

// 创建scala的Map
val scalaMap = Map("id"->"3")
// 将Scala的Map转为java的HashMap集合
val javaMap = scalaMap.asJava
  • Scala List排列组合
    定义6个数,从中任意选2个有多少组合呢?scala提供的combinations,很方便帮我统计有多少种组合。
    排列组合的运算公式如下,这里是使用C排列组合。
    在这里插入图片描述
	// 定义6个数组元素
    val arr = List("1","2","3","4","5","6")
    // 从6个选中2个的组合方式
    val list = arr.combinations(2)
    // 组合方式list.size=15 
    println(list.size)
    // 查看组合方式
    list.foreach(item=>println(item.mkString(",")))

使用scala进行排列组合的运算非常快速。如果使用java怎么做呢?

public class Calculate {

    private static int combinations(int down, int top) {
        int topProduct = 1, downProduct = 1;
        // 这里是计算分子上即6*5
        for (int i = 0; i < top; i++) {
            downProduct *= down;
            down--;
        }
        // 这里计算是1*2
        for (; top > 0; top--) {
            topProduct *= top;
        }

        // 所以计算的是30/2的值
        return downProduct / topProduct;
    }


    public static void main(String[] args) {
        // 6个选2个,分子计算的是6*5/1*2,同理7个选4个就是7*6*5*4/1*2*3*4=35
        int combinations = Calculate.combinations(6, 2);
        System.out.println(combinations);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值