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)
scala作业2
猜你喜欢
转载自blog.csdn.net/weixin_43562705/article/details/91404938
今日推荐
周排行