ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Scala集合

2022-03-06 15:34:52  阅读:163  来源: 互联网

标签:java Scala List scala list println 集合


Scala集合

目录

list: 有序不唯一(有序:指的是插入顺序)

set : 无序唯一

map: kv结构

tuple: 固定长度的集合

一、List集合

scala中的list 相对于Java,提供了很多实用的方法

list set map array 都有以下方法
      * map
      * flatMap
      * filter
      * foreach
      * groupBy

set 集合不能排序, set map 不能反转
1、不可变List

不可变List:不能够对原集合增删元素

List集合的基础方法
package com.shujia.scala

object Demo19List {
  def main(args: Array[String]): Unit = {
    //定义一个list集合
    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

    //获取第一个元素
    println(list.head) //1
    //获取不包含第一个元素的所有元素
    println(list.tail) //List(2, 3, 4, 5, 6, 7, 8, 9)
    //获取最后一个元素
    println(list.last) //9
    //获取前三个元素(从左边取topn)
    println(list.take(3)) // List(1, 2, 3)
    //获取后三个元素(从右边取topn)
    println(list.takeRight(3)) //List(7, 8, 9)
    //通过下标获取元素
    println(list(2)) //3

    //通过一个分隔符将集合拼接成一个字符串(与split功能相反)
    println(list.mkString("|")) // 1|2|3|4|5|6|7|8|9
    println(list.sum) //求和
    println(list.max) //获取最大值
    println(list.min) //获取最小值
    //获取平均值(要转换为double类型)
    println(list.sum / list.length.toDouble) //5.0

    val list2 = List(1, 2, 3, 4, 5, 3, 2, 1)
    //去重,返回一个新的集合
    println(list2.distinct) //List(1, 2, 3, 4, 5)
      
    //反转集合
    println(list.reverse) //List(9, 8, 7, 6, 5, 4, 3, 2, 1)
    //删除一个元素,不改变原集合
    println(list.drop(1)) //List(2, 3, 4, 5, 6, 7, 8, 9)
  }
}
List集合的高级方法:foreach、map、sort、flatMap
  • foreach
package com.shujia.scala

object Demo19List {
  def main(args: Array[String]): Unit = {
    //定义一个list集合
    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
      
    /**
     * foreach: 循环集合中元素,一个一个传递给后面的函数
     */
    var sum = 0
    list.foreach(i => {
      sum += i
    })
    println(sum)  //45
  }
}
  • map
	/**
     * map :循环集合中的元素一个一个传递给后面的函数,
     *       最后将函数的返回值构建成一个新的集合返回
     */
    val list2: List[Int] = list.map((i: Int) => i + 2)
    println(list2) //List(3, 4, 5, 6, 7, 8, 9, 10, 11)
    //改变集合中所有元素的类型
    //将集合中元素的类型转换为String类型(有返回值)
    val strs: List[String] = list.map((i: Int) => i.toString + "a")
    println(strs) //List(1a, 2a, 3a, 4a, 5a, 6a, 7a, 8a, 9a)
  • sort
    /**
     * sort排序(默认是升序)
     * (1)sortBy: 通过一个字段进行排序(参数是个函数)
     * (2)sortWith: 指定一个排序规则(参数是指定规则),返回一个集合
     */

    val list3 = List(2, 5, 1, 6, 2, 1, 3, 4)
    //将集合元素排序
    val sortList: List[Int] = list3.sortBy((i: Int) => i)
    println(sortList) //List(1, 1, 2, 2, 3, 4, 5, 6)
      
    //sortWith: 指定一个排序规则(参数是指定规则),返回一个集合
    //升序
    val sortList2: List[Int] = list.sortWith((i: Int, j: Int) => i < j)
    println(sortList2)  //List(1, 2, 3, 4, 5, 6, 7, 8, 9)
    //降序
    val sortList3: List[Int] = list.sortWith((i: Int, j: Int) => i > j)
    println(sortList3)  //List(9, 8, 7, 6, 5, 4, 3, 2, 1) 

sortBy应用举例

     /**
      * 读取学生数据,按照年龄排序
      */

    //读取文件.获取行数据.转成集合
    val students: List[String] = Source.fromFile("data/students.txt").getLines().toList
	println(students) 
	//List(1500100001,施笑槐,22,女,文科六班, 1500100002,吕金鹏,24,男,文科六班...)

    //按年龄排序(默认是升序)
	//stu.split(",")(2).toInt:按照逗号切分,获取年龄并转换为Int类型
    val studentSort: List[String] = students.sortBy((stu: String) => stu.split(",")(2).toInt)
    studentSort.foreach(println)

//执行结果:
        ...
        1500100985,申飞珍,21,女,文科一班
        1500100993,衡从蕾,21,女,理科二班
        1500100997,陶敬曦,21,男,理科六班
        1500100001,施笑槐,22,女,文科六班
        1500100003,单乐蕊,22,女,理科六班
        1500100005,宣谷芹,22,女,理科五班
        1500100008,符半双,22,女,理科六班
        1500100021,连鸿晖,22,男,理科六班
        1500100024,湛慕卉,22,女,文科二班
        ...
//如果想要排序为降序,-stu.split(",")(2).toInt,前面加个负号即可
  • flatMap

    map:进来一行,返回一行

    flatMap:进来一行,返回多行(炸开后返回)

 //定义一个集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")

println(lines)  
//List(java,spark, java,hadoop, java,scala,hive, bhase,hadoop,scala)
lines.foreach(println)
//结果
    java,spark
    java,hadoop
    java,scala,hive
    bhase,hadoop,scala

获取集合中的每一个单词,一个单词一行(Java的方式)

	//Java的方式
    for (line <- lines) {
      val arr: Array[String] = line.split(",")  //逗号分隔,返回一个数组
      //遍历数组
      for (word <- arr) {
        println(word)
      }
    }
//执行结果:
        java
        spark
        java
        hadoop
        java
        scala
        hive
        bhase
        hadoop
        scala

获取集合中的每一个单词,一个单词一行(数组形式)

//定义一个集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")
	//创建一个数组
	val words = new util.ArrayList[String]()
    for (line <- lines) {
      val split: Array[String] = line.split(",")
      for (word <- split) {
        words.add(word)	//将遍历出来的单词添加到数组
      }
    }
println(words) 
//[java, spark, java, hadoop, java, scala, hive, bhase, hadoop, scala]

获取集合中的每一个单词,一个单词一行(Scala形式)

 flatMap: 将集合中的元素一个一个传递给后面的函数,传入一行返回多行
 flatMap 分两步
     1、先进行一次map操作
     2、将函数返回的数组拆分出来,构建成一个新的集合
//定义一个集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")

 val words2: List[String] = lines.flatMap((line: String) => line.split(","))
    println(words2)
    //List(java, spark, java, hadoop, java, scala, hive, bhase, hadoop, scala)
2、可变List----ListBuffer
object Demo19List {
  def main(args: Array[String]): Unit = {
      //创建一个可变的List集合(ListBuffer)
       val listBuffer = new ListBuffer[String]()
      
    //增加元素
    listBuffer += "java"
    println(listBuffer) //ListBuffer(java)

    //增加多个元素
    listBuffer ++= List("scala", "hadoop", "java")
    println(listBuffer)//ListBuffer(java, scala, hadoop, java)

    //删除一个元素
    listBuffer -= "java"
    println(listBuffer)//ListBuffer(scala, hadoop, java)

    //删除多个元素
    listBuffer --= List("hadoop", "scala")
    println(listBuffer)//ListBuffer(java)

    //通过下标修改元素
    listBuffer.update(0, "hadoop")
    println(listBuffer)//ListBuffer(hadoop)

    //通过下标删除元素
    listBuffer.remove(0)
    println(listBuffer)//ListBuffer()
  }
}

二、Set集合

1、不可变set
package com.shujia.scala

object Demo20 {
  def main(args: Array[String]): Unit = {
    //定义一个set集合
    val set = Set(1, 2, 3, 4, 5, 6, 7, 8, 1, 2)
    println(set) //Set(5, 1, 6, 2, 7, 3, 8, 4),自动去重,排列无序

    //常用方法(Set集合没有元素反转方法,List集合有)
    println(set.head) //5
    println(set.tail) //Set(1, 6, 2, 7, 3, 8, 4)
    println(set.last) //4
    println(set.sum)  //36
    println(set.max)  //8
    println(set.min)  //1

    /**
     * filter: 过滤
     *         将集合中的元素一个一个传递给后面的函数,
     *         函数返回true保留数据,函数返回false过滤数据。
     *         (这个方法List集合也有)
     */
      //取出集合中的奇数
    val filterSet: Set[Int] = set.filter((i: Int) => i % 2 == 1)
    println(filterSet)  //Set(5, 1, 7, 3)

    /**
     * 交集 &
     * 并集 |
     * 差集 &~
     * List集合无该方法
     */
    val s1 = Set(1, 2, 3, 4, 5, 6)
    val s2 = Set(3, 4, 5, 6, 7, 8, 9)
    println(s1 & s2) //Set(5, 6, 3, 4)
    println(s1 | s2) //Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
    println(s1 &~ s2) //Set(1, 2)
  }
}
2、可变set----HashSet

可变set:可以对原集合里的元素进行增删改

object Demo20 {
  def main(args: Array[String]): Unit = {
      //创建一个可变的set集合(HashSet)
    val hashSet = new mutable.HashSet[String]()
    //增加元素的两种方式
    hashSet.add("java")
    hashSet += "scala"
    println(hashSet) //Set(java, scala)

    //移除元素的两种方式
    hashSet.remove("java")
    hashSet -= "scala"
    println(hashSet) //Set()

    //可变集合转换成不可变集合
    val set2: Set[String] = hashSet.toSet
  }
}

标签:java,Scala,List,scala,list,println,集合
来源: https://www.cnblogs.com/saowei/p/15972238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有