scala作业2

1,熟悉scala版本的Wordcount,能自己手写实现
package homework
object hry {
  def main(args: Array[String]): Unit = {
     val arr = Array("hello java","hello C","hello C#")
    //法1:分步骤实现
    //1.切割
    val arr1=arr.flatMap(_.split(" "))
    //2.取出key
    val arr2=arr1.map((_,1))
    //3.按key分组
    val arr3=arr2.groupBy(_._1)
    //4.取出value计算出数量
    val arr4=arr3.map(t=>(t._1,t._2.size))
    //5.转为list
    val arr5=arr4.toList
    //6.进行排序
    val  arr6=arr5.sortWith(_._2>_._2)
    //7.输出结果
    println(arr6)
	//法2:
    //1.归并为一个语句
    val count =arr.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(t=>(t._1,t._2.size)).toList.sortWith(_._2>_._2)
	//输出结果
    println(count)
  }
}
结果:
List((hello,3), (C,1), (java,1), (C#,1))
List((hello,3), (C,1), (java,1), (C#,1))



2,完成下面的需求,需要的集合自己创建
①创建一个Int类型的List
val lst=List(2,3,4,5,6,1,5,6)
②将list1中每个元素乘以2后生成一个新的集合
法1:
val lst1=for(e<-lst)yield 2*e
lst1.foreach(x=>print(x+"  "))
println()
结果:4  6  8  10  12  2  10  12 
法2:
val lst2=lst.map(_*2)
val lst3=lst.map((x:Int)=>x*2)
③将list1中的偶数取出来生成一个新的集合
val lst2=lst.filter(_%2==0)
lst2.foreach(x=>print(x+"  "))
println()
结果:2  4  6  6  
④将list1排序后生成一个新的集合
val lst3=lst.sorted
lst3.foreach(x=>print(x+"  "))
println()
结果:1  2  3  4  5  5  6  6  
⑤反转排序顺序
val lst4=lst.sorted.reverse
lst4.foreach(x=>print(x+"  "))
println()
结果:6  6  5  5  4  3  2  1 
⑥将Iterator转换成List
  val arr=Array(1,2,3,4)
  val lst=arr.iterator.toList
⑦将多个list压扁成一个List
val res4 = List(List(1, 2, 3, 4, 5, 6), List(2, 3, 4, 5, 6, 7), List(3, 4, 5, 6, 7))
val res5 = res4.flatten
res5.foreach{ x => print(x+"  ")}
结果:1  2  3  4  5  6  2  3  4  5  6  7  3  4  5  6  7  
⑧先按空格切分,再压平
法1:
val arr = List("hello java","hello scala","hello hadoop")
val res6=arr.flatten(_.split(" "))
res4.foreach{x=>print(x+"  ")}
结果:hello  java  hello  scala  hello  hadoop 
法2:
arr.flatMap((x:String)=>x.split(" "))
⑨并行计算求和
法1:
val res=lst.sum
println(res)
结果:32
法2:
val res1=lst.reduce((x,y)=>x+y)
println(res1)
结果:32
法3:
val res2=lst.reduce(_+_)
println(res2)
结果:32
法4:
val res3=res.foldLeft(0)(_+_)
法5:
val res4=res.foldLeft(0)((x:Int,y:Int)=>x+y)
拓展:求最大值
val res5=res.max
val res6=res.foldLeft(0)((x:Int,y:Int)=>if(x>y) x else y)
⑩单线程聚合
val lst5=lst.aggregate((x:Int)=>x(_+,_+))
⑩并行聚合
法1:
val res=lst.par.sum
println(res)
结果:32
法2:
val res1=lst.par.reduce((x,y)=>x+y)
println(res1)
结果:32
法3:
val res2=lst.par.reduce(_+_)
println(res2)
结果:32


3.需求:统计一个聚合结果,结果为一个元组,元组里有两个结果值
第一个值是arr数组里所有元素的总和,
第二个值是在聚合过程中有多少个数参与计算,例如统计集合(1,2,3,4,5,6,7,8,9,10)结果是: (55, 10)
  法1:
  def main(args: Array[String]): Unit = {
    val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val tuple = arr.aggregate((0, 0))(
      (a, n) => (a._1 + n, a._2 + 1),
      (p1, p2) => (p1._1 + p2._1, p1._2 + p2._2)
    )
    val res1=tuple.productElement(0)
    val res2=tuple.productElement(1)
    print("("+res1+","+res2+")")
  }
  结果:(55,10)
  法2:
  val arr1=arr.map((_,1)).reduce((x:(Int,Int),y:(Int,Int))=>(x._1+y._1,x._2+y._2))
  val res3=arr1.productElement(0)
  val res4=arr1.productElement(1)
  print("("+res3+","+res4+")")
①求并集
val set1 = Set(5,6,9,20,30,45)
val set2 = Set(50,60,9,20,35,55)
println(set2.union(set1))
结果:Set(5, 20, 6, 60, 9, 45, 35, 50, 55, 30)
②求交集
val set1 = Set(5,6,9,20,30,45)
val set2 = Set(50,60,9,20,35,55)
法1:
println(set2.intersect(set1))
结果:Set(20, 9)
法2:
println(set1 & set2)
结果:Set(20, 9)
③求差集
val set1 = Set(5,6,9,20,30,45)
val set2 = Set(50,60,9,20,35,55)
法1:
println(set1.diff(set2))
结果:Set(5, 6, 45, 30)
法2:
println(set1 &~ set2)
结果:Set(5, 6, 45, 30)

猜你喜欢

转载自blog.csdn.net/weixin_43562705/article/details/91404938