scala 集合通用方法

Posted 钟钟终

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala 集合通用方法相关的知识,希望对你有一定的参考价值。


活动地址:CSDN21天学习挑战赛

元组:

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    val tuple1:(String,Int,Char,Boolean)=("hello",2,'c',true)
    //访问
    println(tuple1._1)
    println(tuple1._2)
    //遍历
    for(elem<-tuple1.productIterator)
      println(elem)

    //嵌套元组
    val mul=(12,0.3,"hello",(23,"scala"),24)
    println(mul._4._1)

  

常用函数(一)

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    //通用操作
    val list=List(1,3,5,7,9)
    val set=Set(23,32,43,34,44)
    //获取长度
    println(list.length)
    println(set.size)
    //循环遍历
    for(elem<- list)
      println(elem)
    set.foreach(println)
    //迭代器
    for (elem<-list.iterator)
      println(elem)
    //生成字符串
    println(list)
    println(set)
    println(list.mkString("|"))
    //是否包含
    list.contains(23) 
  

常用函数(二)

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    val list1=List(1,3,5,7,9)
    val list2=List(3,7,5,7,6,8)

    println(list1.head) //头
    println(list1.tail) //尾
    println(list1.last) //最后一个元素
    println(list1.init) //不包含最后一个元素
    println(list1.reverse)
    println(list1.take(3))
    println(list1.takeRight(3))
    println(list1.drop(3))
    println(list1.dropRight(3))

    val un=list1.union(list2)  //并集
    //如果是Set做并集,会去重、无序
    val it=list1.intersect(list2) //交集
    val diff1=list1.diff(list2) //独属于list1
    val diff2=list2.diff(list1) //读书与list2

    //拉链 对应元素组成一个二元组
    val zip1=list1.zip(list2)
    val zip2=list2.zip(list1)

    //滑窗
    for(elem<-list1.sliding(3,2)) //大小 步长
      println(elem)
  


常用函数(三) 最值、排序

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    val list=List(1,3,4,-44,67,53)
    val list2=List(("a",4),("b",55),("c",43),("d",8))

    println(list.sum)//求和
    println(list.product) //乘积
    println(list.min) //最小值

    println(list.max) //最大值
    println(list2.max)  //默认根据第一个值排序

    println(list2.maxBy((tuple:(String,Int))=>tuple._2))
    println(list2.maxBy(_._2))

    //排序
    val list3=list.sorted sorted默认升序
    println(list3)
    val list4=list.sorted(Ordering[Int].reverse)
    println(list4)

    val list5=list2.sorted
    println(list5)
    val list6=list2.sortBy((tuple:(String,Int))=>tuple._2)
    // list6=sortBy(_._2)
    println(list6)
    val list7=list2.sortBy(_._2)(Ordering[Int].reverse)
    println(list7)

    println(list.sortWith((a:Int,b:Int)=>a<b))
    println(list.sortWith(_>_))
  


fileter、map、reduce、fold高级函数

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    val list=List(1,2,3,4,5,6,7,8,9)

    //过滤,遍历一个集合从中获取满足指定条件的元素组成一个新的集合
    val even=list.filter((elem:Int)=>elem %2==0)
    println(list.filter(_%2==1))

    //转化、映射
    println(list.map(elem=>elem*2))
    println(list.map(_*2))
    println(list.map(x=>x*x))

    //扁平化
    val list2=List(List(1,2,3),List(7,8,9),List(4,5,6))
    val list3=list2(0):::list2(1):::list2(2)
    println(list3)
    val list4=list2.flatten
    println(list4)

    //扁平映射  eg:将一组字符串进行分词,并保存成单词的列表
    val s=List("hello world","hello java","hi scala")
    val s1=s.map(_.split(" "))
    val s2=s1.flatten
    println(s2)
    println(s.flatMap(_.split(" ")))

    //分组  按照指定规则
    val group=list.groupBy( _ %2)
    println(group)
    val group2=list.groupBy(x=>if(x%2==0) "even" else "odd")
    println(group2)
    //eg:给定一组词汇,根据首字母进行分组
    val wc=List("china","america","alice","carry")
    println(wc.groupBy(_.charAt(0)))

    //规约 简化 reduce类操作
    println(list.reduce((a,b)=>a+b))
    println(list.reduce(_+_))
    println(list.reduceLeft(_+_))
    println(list.reduceRight(_+_))

    println(list.reduce(_-_)) //-43
    println(list.reduceLeft(_-_)) //-43
    println(list.reduceRight(_-_)) //5

    println(list.fold(45)(_+_)) //传入一个初值
    println(list.fold(45)(_-_))
    println(list.foldRight(2)(_-_))
    
    //折叠

  


eg:应用实例

import scala.Boolean
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    //eg1:map键值对值的合并
    val mp1=Map("a"->1,"b"->4,"c"->6)
    val mp2=mutable.Map("a"->6,"b"->4,"c"->9,"d"->3)
    println(mp1++mp2)
    println(mp2++mp1)
    val mp3=mp1.foldLeft(mp2)(
      (mp,kv)=>
        val key=kv._1
        val value=kv._2
        mp(key)=mp.getOrElse(key,0)+value //值合并
        mp
      
    )
    println(mp3)

    //eg2:合并相同的的单词、计数并取前三 (简易版)
    val s=List("hello world","hello scala",
      "hi world","java scala",
      "flink from scala")
    val s1=s.flatMap(_.split(" "))
    println(s1)
    //分组合并
    val s2=s1.groupBy(x=>x)
    println(s2)
    //个数统计
    val s3=s2.map(kv=>(kv._1,kv._2.size))
    println(s3)
    //只能针对列表,因此先转化为列表,排序
    val s4=s3.toList.sortWith((kv1,kv2)=>kv1._2>kv2._2).take(3)
    println(s4)

    // 复杂版
    val s5=List(("hello world",3),("hello scala",2),
      ("hi world",1),
      ("java scala",2),
      ("flink from scala",3))

    //思路一:直接全部展开
    val s6=s5.map(
      kv=>
        (kv._1+" ")*kv._2
      
    )
    println(s6)
    val s7=s6.flatMap(_.split(" "))
      .groupBy(x=>x)
      .map(kv=>(kv._1,kv._2.size))
      .toList.sortWith(_._2>_._2)
      .take(3)
    println(s7)
    //思路2:
    val s8=s5.flatMap(
      tuple=>
        val st=tuple._1.split(" ").map(x=>(x,tuple._2))
        st
      
    )
    val s9=s8.groupBy(_._1).mapValues(
      list=>list.map(_._2).sum
    ).toList.sortWith(_._2>_._2).take(3)
    println(s9)
  


并行队列

import scala.Boolean
import scala.collection.immutable.Queue
import scala.collection.mutable

object test01 
  def main(args: Array[String]): Unit = 
    //队列
    val q=new mutable.Queue[String]()
    q.enqueue("a","abc","ff")
    println(q)
    q.dequeue()
    println(q)
    //不可变队列
    val q2=Queue("a","b","c")
    q2.enqueue("d")
    println(q2)  //不会变,需要新变量接收

    //并行集合
    val longs = (1 to 100).par.map(
      x => Thread.currentThread.getId
    )
    println(longs)
  


以上是关于scala 集合通用方法的主要内容,如果未能解决你的问题,请参考以下文章

Scala:创建通用集合的问题

如何对Scala中集合进行排序?

Scala的泛型

scala中 sorted,sortBy,sortWith语法使用

scala中 sorted,sortBy,sortWith语法使用

Scala集合