|NO.Z.00024|——————————|BigDataEnd|——|Hadoop&Scala.V04|——|Scala.v04|数组元组|常见算法|

一、常见算法
### --- 常见算法

~~~     在Scala中对数组进行转换非常简单方便,这些转换动作不会修改原始数组,
~~~     而是产生一个全新的数组。
~~~     任务:将数组中偶数元素加倍,奇数元素丢弃
### --- 编程示例

val arr = (1 to 10).toArray

# -- 使用for推导式。注意:原来的数组并没有改变
val result1 = for (elem <- arr) yield if (elem % 2 == 0) elem * 2 else 0
val result2 = for (elem <- arr if elem %2 == 0) yield elem * 2

# -- scala中的高阶函数
arr.filter(_%2==0).map(_*2)
~~~     取第一个元素
a1.head
~~~     取最后一个元素
a1.last
~~~     除了第一个元素,剩下的其他元素
a1.tail
~~~     除了最后一个元素,剩下其他元素
a1.init
~~~     # 数组常用算法
Array(1,2,3,4,5,6,7,8,9,10).sum                 # 求和
Array(2,3,4).product                            # 元素相乘
Array(1,2,3,4,5,6,7,8,9,10).max                 # 求最大值
Array(1,2,3,4,5,6,7,8,9,10).min                 # 求最小值
Array(1,3,2,7,6,4,8,9,10).sorted                # 升序排列

~~~     # max、min、sorted方法,要求数组元素支持比较操作
Array(1,2,3,4,5,4,3,2,1).map(_*2)
Array(1,2,3,4,5,4,3,2,1).reduce(_+_)
Array(1,2,3,4,5,4,3,2,1).distinct               # 数据去重
Array(1,2,3,4,5,4,3,2,1).length
Array(1,2,3,4,5,4,3,2,1).size
Array(1,2,3,4,5,4,3,2,1).indices                # 数据索引
~~~     # count计数,需要注意的是count中必须写条件
Array(1,2,3,4,5,4,3,2,1).count(_>3)
Array(1,2,3,4,5,4,3,2,1).count(_%2==0)

~~~     # filter 过滤数据,原始数组中的数据保持不变,返回一个新的数组
Array(1,2,3,4,5,4,3,2,1).filter(_>3)
Array(1,2,3,4,5,4,3,2,1).filterNot(_%2==0)

~~~     # 在REPL环境中输入数组名称即可打印数组元素,非常方便
~~~     # 在IDEA中,print(a) / print(a.toString)都不能打印数组元素
~~~     # 使用mkString / toBuffer 是打印数组元素简单高效的方法
Array(10,9,8,7,6,5,4,3,2,1).toString
Array(10,9,8,7,6,5,4,3,2,1).mkString(" & ")
Array(10,9,8,7,6,5,4,3,2,1).mkString("<", " & ", ">")
Array(10,9,8,7,6,5,4,3,2,1).toBuffer
~~~     take取前4个元素;takeRight取后4个元素
~~~     原始数组中的数据保持不变,返回一个新的数组
Array(1,2,3,4,5,6,7,8,9,10).take(4)
Array(1,2,3,4,5,6,7,8,9,10).takeRight(4)

~~~     takeWhile 从左向右提取列表的元素,直到条件不成立(条件不成立时终止)
Array(1,2,3,4,5,6,1,2,3,4).takeWhile(_<5)

~~~     drop 删除前4个元素;dropRight删除后4个元素;
~~~     dropWhile删除元素,直到条件不成立
Array(1,2,3,4,5,6,7,8,9,10).drop(4)
Array(1,2,3,4,5,6,7,8,9,10).dropRight(4)
Array(1,2,3,4,5,6,1,2,3,4).dropWhile(_<5)

~~~     将数组分为前n个,与剩下的部分
Array(1,2,3,4,5,6,7,8,9,10).splitAt(4)

~~~     数组切片。取下标第2到第4的元素(不包括第5个元素)
~~~     返回结果:Array(2, 3, 4)
Array(0,1,2,3,4,5,6,7,8,9,10).slice(2,5)

~~~     拉链操作;a1,a2的长度不一致时,截取相同的长度
val a1 = Array("A","B","C")
val a2 = Array(1,2,3,4)
val z1 = a1.zip(a2)

~~~     拉链操作;a1,a2的长度不一致时,a1用 * 填充,a2用 -1 填充
val z2 = a1.zipAll(a2, "*", -1)
val z3 = a1.zipAll(a2, -1, "*")

~~~     用数组索引号填充
val z4 = a1.zipWithIndex
~~~     unzip 的逆操作,拆分成2个数组
val (l1,l2) = z4.unzip

~~~     unzip3拆分成3个数组
val (l1,l2,l3) = Array((1, "one", '1'),(2, "two", '2'),(3, "three", '3')).unzip3

~~~     用于数组的操作符(:++:++)
~~~     :+ 方法用于在尾部追加元素;+: 方法用于在头部追加元素;
~~~     备注:冒号永远靠近集合类型,加号位置决定元素加在前还是后;
~~~     ++ 该方法用于连接两个集合(数组、列表等),arr1 ++ arr2;
val a = (1 to 4).toArray
val b = (5 to 8).toArray

~~~     分别在集合头部、尾部增加元素;连接两个集合
val c = 10 +: a
val d = c :+ 9
val e = a ++ b

~~~     说明:上述的很多方法不仅仅对Array适用,一般情况下对其他集合类型同样适用。
val list = (1 to 10).toList
list.sum
list.max
list.take(4)
list.drop(4)
~~~     # 数组排序

val nums = Array(1, 3, 2, 6, 4, 7, 8, 5)
println(nums.sorted.toBuffer)               # 升序
println(nums.sorted.reverse.toBuffer)       # 降序
println(nums.sortWith(_ > _).toBuffer)      # 降序
println(nums.sortWith(_ < _).toBuffer)      # 升序
### --- 编程代码

package yanqi.cn.part03

object OperatorDemo {
  def main(args: Array[String]): Unit = {
    //将数组中的偶数加倍,奇数丢弃
    val nums = (1 to 10).toArray
    val result1 = for (elem <- nums if elem % 2 == 0) yield elem * 2
    val result2 = for (elem <- nums) yield if (elem % 2 == 0) elem * 2 else 0
    result1.foreach(println(_))
    println("=============================")
    result2.foreach(println(_))

    //使用Scala中的高阶函数来实现
    nums.filter(_ % 2 == 0).map(_ * 2).foreach(println(_))

    println("=============================")
    //获取第一个元素
    println(nums.head)
    //获取最后一个元素
    println(nums.last)
    //获取除了第一个元素之外的其他元素
    println(nums.tail.toBuffer)
    //获取除了最后一个元素之外的其他元素
    println(nums.init.toBuffer)

    //求和
    println(nums.sum)
    //求最大值
    println(nums.max)
    //求最小值
    println(nums.min)

    val nums2 = Array(2, 1, 4, 3)
    //数组元素排序,升序
    println(nums2.sorted.toBuffer)
    //元素相乘
    println(nums2.product)

    println("====================================")
    val nums3 = Array(1, 2, 3, 4, 3, 2, 1)
    println(nums3.map(_ * 2).toBuffer)
    println(nums3.reduce(_ + _))
    //将数组中的数据进行去重
    println(nums3.distinct.toBuffer)
    println(nums3.length)
    println(nums3.size)
    //获取数组中每个元素的索引
    println(nums3.indices.toBuffer)

    //使用mkString进行输出
    println(nums3.mkString(" & "))
    println(nums3.mkString("<", " & ", ">"))

    //count计数,注意:count后面必须有条件
    println(nums3.count(_ > 2))
    println(nums3.count(_ % 2 == 0))

    //filter过滤出符合条件的数据;  filterNot过滤出不符合条件的数据
    println(nums3.filter(_ > 2).toBuffer)
    println(nums3.filterNot(_ % 2 == 0).toBuffer)

    println("========================================")
    //take提取前N个元素
    println(nums3.take(3).toBuffer)
    //takeRight提取后N个元素
    println(nums3.takeRight(4).toBuffer)
    //takeWhile从左向右进行提取,提取出符合条件的元素,如果条件不成立就终止提取
    println(nums3.takeWhile(_ < 4).toBuffer)

    println("========================================")
    //删除前N个元素
    println(nums3.drop(3).toBuffer)
    //删除后N个元素
    println(nums3.dropRight(3).toBuffer)
    //从左向右删除符合条件的元素,如果条件不成立,就终止删除操作
    println(nums3.dropWhile(_ < 4).toBuffer)

    println("========================================")
    //将数组分为两部分,前N个为一部分,剩下的为另一部分
    val tuple: (Array[Int], Array[Int]) = nums3.splitAt(3)
    println(tuple._1.toBuffer + "  " + tuple._2.toBuffer)
    //对数组进行切片操作,取出从索引2到索引4的元素,不包括索引为5的元素
    println(nums3.slice(2, 5).toBuffer)

    println("========================================")
    val array1 = Array("A", "B", "C")
    val array2 = Array(1, 2, 3, 4)
    //拉链操作,当两个数组的长度不一样时,截取相同的长度
    val z1: Array[(String, Int)] = array1.zip(array2)
    println(z1.toBuffer)

    //拉链操作,当两个数组长度不一样时,array1用*填充,array2用-1填充
    val z2 = array1.zipAll(array2, "*", -1)
    //拉链操作,当两个数组长度不一样时,array2用*填充,array1用-1填充
    val z3 = array2.zipAll(array1, "*", -1)
    //用数组索引进行填充
    val z4 = array1.zipWithIndex
    println(z2.toBuffer)
    println(z3.toBuffer)
    println(z4.toBuffer)

    println("========================================")
    //通过unzip进行拆分数组的操作
    // 通过unzip把z4拆分成两个数组
    val (l1, l2) = z4.unzip
    println(l1.toBuffer)
    println(l2.toBuffer)

    val (l3, l4, l5) = Array((1, "one", '1'), (2, "two", '2'), (3, "three", '3')).unzip3
    println(l3.toBuffer)
    println(l4.toBuffer)
    println(l5.toBuffer)

    //数组的操作符::+  +:  ++
    // :+用于在数组的尾部追加元素; +:用于在数组的头部追加元素
    // ++用于连接两个集合(比如:数组、列表等)
    val num1 = (1 to 4).toArray
    val num2 = (5 to 8).toArray

    val num3 = 10 +: num1
    val num4 = num2 :+ 9
    val num5 = num1 ++ num2
    println("========================================")
    println(num3.toBuffer)
    println(num4.toBuffer)
    println(num5.toBuffer)

    println("===========数组排序==============")
    val sortNums=Array(1,3,5,2,7,8,6,9)
    //升序
    println(sortNums.sorted.toBuffer)
    //降序
    println(sortNums.sorted.reverse.toBuffer)
    //降序
    println(sortNums.sortWith(_>_).toBuffer)
    //升序
    println(sortNums.sortWith(_<_).toBuffer)

  }
}
### --- 编译打印

D:\JAVA\jdk1.8.0_231\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54985:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\jdk1.8.0_231\jre\lib\charsets.jar;D:\JAVA\jdk1.8.0_231\jre\lib\deploy.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\access-bridge-64.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\cldrdata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\dnsns.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jaccess.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\jfxrt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\localedata.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\nashorn.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunec.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunjce_provider.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunmscapi.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\sunpkcs11.jar;D:\JAVA\jdk1.8.0_231\jre\lib\ext\zipfs.jar;D:\JAVA\jdk1.8.0_231\jre\lib\javaws.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jce.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfr.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jfxswt.jar;D:\JAVA\jdk1.8.0_231\jre\lib\jsse.jar;D:\JAVA\jdk1.8.0_231\jre\lib\management-agent.jar;D:\JAVA\jdk1.8.0_231\jre\lib\plugin.jar;D:\JAVA\jdk1.8.0_231\jre\lib\resources.jar;D:\JAVA\jdk1.8.0_231\jre\lib\rt.jar;E:\NO.Z.10000——javaproject\NO.Z.00002.Hadoop\ScalaPro\out\production\ScalaPro;D:\JAVA\scala-2.12.2\lib\scala-library.jar;D:\JAVA\scala-2.12.2\lib\scala-reflect.jar yanqi.cn.part03.OperatorDemo
4
8
12
16
20
=============================
0
4
0
8
0
12
0
16
0
20
4
8
12
16
20
=============================
1
10
ArrayBuffer(2, 3, 4, 5, 6, 7, 8, 9, 10)
ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)
55
10
1
ArrayBuffer(1, 2, 3, 4)
24
====================================
ArrayBuffer(2, 4, 6, 8, 6, 4, 2)
16
ArrayBuffer(1, 2, 3, 4)
7
7
ArrayBuffer(0, 1, 2, 3, 4, 5, 6)
1 & 2 & 3 & 4 & 3 & 2 & 1
<1 & 2 & 3 & 4 & 3 & 2 & 1>
3
3
ArrayBuffer(3, 4, 3)
ArrayBuffer(1, 3, 3, 1)
========================================
ArrayBuffer(1, 2, 3)
ArrayBuffer(4, 3, 2, 1)
ArrayBuffer(1, 2, 3)
========================================
ArrayBuffer(4, 3, 2, 1)
ArrayBuffer(1, 2, 3, 4)
ArrayBuffer(4, 3, 2, 1)
========================================
ArrayBuffer(1, 2, 3)  ArrayBuffer(4, 3, 2, 1)
ArrayBuffer(3, 4, 3)
========================================
ArrayBuffer((A,1), (B,2), (C,3))
ArrayBuffer((A,1), (B,2), (C,3), (*,4))
ArrayBuffer((1,A), (2,B), (3,C), (4,-1))
ArrayBuffer((A,0), (B,1), (C,2))
========================================
ArrayBuffer(A, B, C)
ArrayBuffer(0, 1, 2)
ArrayBuffer(1, 2, 3)
ArrayBuffer(one, two, three)
ArrayBuffer(1, 2, 3)
========================================
ArrayBuffer(10, 1, 2, 3, 4)
ArrayBuffer(5, 6, 7, 8, 9)
ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8)
===========数组排序==============
ArrayBuffer(1, 2, 3, 5, 6, 7, 8, 9)
ArrayBuffer(9, 8, 7, 6, 5, 3, 2, 1)
ArrayBuffer(9, 8, 7, 6, 5, 3, 2, 1)
ArrayBuffer(1, 2, 3, 5, 6, 7, 8, 9)

Process finished with exit code 0

 
 
 
 
 
 
 
 
 

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
                                                                                                                                                   ——W.S.Landor

 

 

posted on   yanqi_vip  阅读(21)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示