在Scala里面如何使用元组

元组在Scala语言中是一种十分重要的数据结构,类似数据库里面的一行记录(row),它可以将不同类型的值组合成一个对象,在实际应用中十分广泛。

先来看一个简单的tuple定义:

val tuple=("张三",25)//定义一个tuple
val (name,age)=(//变量绑定模式

上面的第二种例子中,可以直接通过name和age来访问单个tuple的元素

例子(1):

一个简单的模式匹配

val tuple=(1,2,3,4)

    def tupleMatch(x:Any)=x match {
      case (first,second)=> println(s"第一个元素:${first} 第二个元素:${second}")
      ${first} 第三个元素:${three}")
      case _=> println("没有任何匹配")
    }

    tupleMatch(tuple)//匹配上面的第二个

例子(2):

根据类型匹配

def typeMatch(x:Any)=x match {

      case x:String=> println("string")
      case x:Int=> "int")
      Boolean=>"boolean")
      case _=> "其他")

    }

    typeMatch("x")

注意上面的代码里面case后面的如果有List[String]类型的,最好用一个类封装起来在做匹配,否则会出错。具体的方式请参考: https://www.cakesolutions.net/teamblogs/ways-to-pattern-match-generic-types-in-scala

例子(3):

变量绑定模式

//定义一个对象元组
    case class Dog(val name:String,val age:Int)
    val dog=Dog("Pet",2)

    def patternMatch(x:Any)=x match {
      case d@Dog(_,_)=>println("变量值:"+d.name)
      "默认")
    }

    patternMatch(dog)//Pet

注意普通的类不能直接使用上面的模式匹配

例子(4):

for循环的使用元组进行的模式匹配

val map= Map("java"->"Hadoop","js"->"vue",68);">"scala"->"spark")
    //1,变量模式匹配
    for( (k,v)<-map ){
      println(k,v)
    }

    println("====================")
    //2,常量模式匹配,第二个值必须是spark,才会打印出来
    "spark")<-"====================")
   //3,类型匹配模式,注意elasticsearch是不会被打印出来的
    String)<-   Map("spark",68);">"elasticsearch"->"java".size)   ){
      //4,构造函数模式匹配
    case class Dog(val name:String,val age:Int)

    for(Dog(name,age)<-List(Dog("pet",2),Dog("penny",3),68);">"digo",4)  )  ){
      println(s"Dog ${name} is ${age} years old")
    }

    //5,序列模式匹配
    for( List(first,_*)<- List( List(1,List(4,5,6,7)  )    ){

      "${first}")
    }
    //6,变量绑定的另一种模式
    val list2=List( List(1,7))

    def list2Match(x:AnyRef)=x match {

      case List(first,e@List(4,_*)) => println(e)
      case _=> "defalult")
    }
    list2Match(list2)

结果:

(java,Hadoop)
(js,vue)
(scala,spark) ====================
(scala,spark) ====================
(java,spark) ====================
Dog pet is 2 years old
Dog penny is 3 years old
Dog digo is 4 years old ====================
1
4 ====================
List(4,5,6,7)

最后我们使用元组,来模拟一个类似下面的SQL的例子:

表(pet)结构:

name(string),ct(int)
cat,2
cat,6
cat,2
dog,1
dog,2

统计语句:

select name,51);font-weight:700;">sum(ct) as c,51);font-weight:700;">count(*),51);font-weight:700;">max(ct),51);font-weight:700;">min(ct) from pet group by name order c desc

Scala代码如下:

list = ArrayBuffer[(String,Int)]()

    list += (("cat",2))
    6))
    "dog",1))
    2))


    println("宠物名,数量")
    //使用打印所有的数据
    for ((name,count) <- list) {
      println(name,count)

    }

    println("=================================")

    //求出,按宠物名分组,出现数量和,出现总次数,最大数量,最小数量,并按照总次数降序排序
    val result = list.groupBy(_._1).map {
      case (key,valueList) => {
        val sum = valueList.map(_._2).sum//求valueList出现次数的总和
        val maxCount = valueList.max._2//最大次数
        val minCount = valueList.min._2//最小次数
        (key -> (sum,valueList.size,maxCount,minCount))//以Map的结果返回
      }

    }.toSeq.sortWith(_._2._1 > _._2._1)
    //转化成Seq后才能进行排序操作,相当于取的是_._2代表的是value的值,
    //继续_1代表的是取里面的sum进行降序排序,如果是<号,则是升序排


    //使用元组遍历最终结果
    println()
    for( (name,(sum,size,minCount)) <-result ){
      println(name,sum,minCount)
    }

其实,核心代码只有中间的这一部分:

val result = list.groupBy(_._1).map {//分组处理
      sum = valueListmap(_._2).sum//求valueList出现次数的总和
        val maxCount = valueListmax._2//最大次数
        val minCount = valueListmin//最小次数
        (key -> (sum,valueList.size,136);font-style:italic;">//以Map的结果返回
      }

    }.toSeq.sortWith(_._2._1 > _._1)//降序排

最终结果:

宠物名,数量
(cat,2)
(cat,6)
(cat,2)
(dog,1)
(dog,2)
=================================
宠物名,出现总次数,最大数量,最小数量
(cat,10,1)

简单解释一下核心部分的代码含义:

首先执行了一个groupBy函数,对元组里面的第一个元素也就是宠物名进行 分组,分组之后,每个宠物名一样的数据会聚合在一起,然后执行一个map函数,对里面的valueList进行各种运算,得出来我们 需要的结果后,最终再以Map的数据结构返回,因为Map本身是没法排序的,所以我们得先需要转成Seq类型,最后再执行sortWith方法对value里面的最大次数进行降序排,如果是升序排,只需要把大于号该成小于号即可。

总结:

本篇主要介绍了tuple几种常见的应用场景,通过使用tuple数据结构配合上scala强大的函数方法,我们可以轻松愉快的处理的各种数据集,感兴趣的小伙伴可以自己尝试一下。


有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

输入图片说明

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 TwemojiTwemoji是Twitter开源的其完整的Emoji表情图片。开发者可以去GitHub下载完整的表情库,并把这些表情加入到自己的应用或网页中。使用示例:var i = 0;twemoji.parse(  ’emoji, m\u276
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即两个对象在内存中的首地址;equals比较字符串中所包含的内容是否相同。publicstaticvoidmain(String[]args){​ Strings1="abc"; Strings2=newString("abc");​ System.out.println(s1==s2)
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么使用”吧!语法scala...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相信很多人在Scala是一种什么语言问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相信很多人在Scala Trait怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日常操作中,相信很多人在Scala类型检查与模式匹配怎么使用问题上存在疑惑,小编查阅了各式资料,整理...
这篇文章主要介绍“scala中常用但不常见的符号有哪些”,在日常操作中,相信很多人在scala中常用但不常见的符号有哪些问题上存在疑惑,小编查阅了各式资料,整理...
本篇内容主要讲解“Scala基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala基础知识有哪些”...
本篇内容介绍了“scala基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容介绍了“Scala下划线怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
本篇内容主要讲解“Scala提取器怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala提取器怎么使用”...
这篇文章主要讲解了“Scala基础语法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala基础语法有...
本篇内容主要讲解“Scala方法与函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala方法与函数怎...
这篇文章主要讲解了“scala条件控制与循环怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala条...
这篇文章主要介绍“scala函数怎么定义和调用”,在日常操作中,相信很多人在scala函数怎么定义和调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操
这篇文章主要介绍“scala如何声明变量”,在日常操作中,相信很多人在scala如何声明变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对...
这篇文章主要讲解了“scala的Map和Tuple怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“scala的Ma...
这篇文章主要介绍“scala的隐式参数有什么作用”,在日常操作中,相信很多人在scala的隐式参数有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
本篇内容主要讲解“Scala怎么进行文件写操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala怎么进行文件...
这篇文章主要讲解了“Scala怎么声明数组”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Scala怎么声明数组...