一、常见算法

### --- 常见算法

~~~ 在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