关于过滤

19 阅读2分钟

首先在代码里面总有一些属于过滤器的东西,就好比满分100分,一个班级,需要筛选90份以上的学生,假如这个班人数少,还好一点,可是一个班级人数多起来,就会变得非常麻烦,所以,这个时候就用到了过滤器

1.筛选成绩的过滤器

当我给出一组数,我需要从里面找出80分以上的人,那我可以选择敲击以下代码

object base49 {
  def main(args: Array[String]): Unit = {
    // 把数值为偶数的留下来
    val arr1 = Array(1,2,3,4,5)
    val arr2 = arr1.filter(x => x%2==0)
    arr2.foreach(println)

    // 把小于80分的值去掉,只保留大于80分的分数
    var score = Array(90,98,60,49,100)
    val scoreFiltered = score.filter(score => score > 80)
    scoreFiltered.foreach(println)
  }
}

运行结果只会显示90,98,100,还有上面的偶数2,4,如图所示:

image.png

2.一直相加

假如我给你一个数组,需要你把这里的内容全部相加,和标题一一样,元素少还好,元素多起来就不好了。面对这个问题,可以输入以下代码:

object base50 {
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
    // 求数组元素的累加
    val rst = arr.reduce( (x,y)=> x + y )

    //val rst = arr.sum
    println(s"rst = ${rst}")
  }
}

运行结果只能是15,如图所示:

image.png

3.有方向的相减

上面的问题只是一直相加,相加从左往右和从右往左的结果是一样的,可是减法不一样,减法有它自己的两种结果,依然给出一个数组,可以试试输入以下代码:

object base51 {
  // reduce ==== reduceLeft 从左向右计算
  //            reduceRight 从右向左计算
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3)
    val rst = arr.reduceLeft( (x,y)=> x - y )
    val rst1 = Array(1,2,3,4).reduceRight( (x,y)=> x - y )
    println(s"rst = ${rst}")
    println(s"rst1 = ${rst1}")
  }
}

运行结果如图所示:

image.png

4.排序问题

有的时候,我们需要按照数字大小进行排序,或者在一堆英文里面,我们为了记住单词,会选择按照26字母进行记忆,所以就有了以下代码:

object base52 {
  // sorted: 排序
  def main(args: Array[String]): Unit = {
    // 对数值元素排序:从小到大排序
    var arr = Array(-1,10,-2,1,2,3).sorted
    arr.foreach(println)

    // 对字符元素排序,字典顺序
    var arr2 = Array("zoom", "bus","apple", "banana", "car").sorted
    arr2.foreach(println)
  }
}

它的运行结果如图所示:

image.png 如果你还能想出某些排序的方式,可以自己尝试一下

object base53 {
  // sortWith: 自定义排序
  // sortWith( (x,y) => 布尔值 )
  // (1)如果返回值是true,那么x就在y的前面
  // (1)如果返回值是false,那么x就在y的后面
  def main(args: Array[String]): Unit = {
    // 对数值元素排序:按照离 1 这个点的距离的从小到大排序
    var arr = Array(-1,10,-2,1,2,3).sortWith((x,y) => Math.abs(x - 1) < Math.abs(y - 1) )
    arr.foreach(println)
  }
}

image.png