18集合操作

本文最后更新于 2021-08-05 11:42:59

集合操作

Zip拉链

object ZipDemo {

  def main(args: Array[String]): Unit = {
    //拉链函数
    val l1 = List(1,2,3,4,5)
    val l2 = List(6,7,8,9,10)
    //一对一配对
    //以短的为标准,多余的抛弃
    val l3:List[(Int,Int)] = l1.zip(l2)

    //以多的为标准
    //l1的默认值为-1 l2的默认值为-2
    val l4:List[(Int,Int)] = l1.zipAll(l2,-1,-2)

    //自己与自己的索引zip
    val index:List[(Int,Int)] = l1.zipWithIndex

    //unzip
    //二维元组
    val unzip:(List[Int],List[Int]) = l3.unzip

  }
}

Slide滑窗

object SlideDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1,2,3,4,5)
    //滑窗函数
    //每次取3个 ,步长为1
    val it:Iterator[List[Int]] = l1.sliding(3,1)
    for (elem <- it) {
      println(elem)
    }
  }
  //List(1, 2, 3)
  //List(2, 3, 4)
  //List(3, 4, 5)
}

map

object MapDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    //一进一出
    val res = l1.map(x => x * 2)
    val res1 = l1.map(_ * 2)
  }
}

foreach

object ForeachDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    l1.foreach(println(_))
    l1.foreach(println)

   //部分应用函数
    val square = math.pow(_,2)
    val d = square(2)

    //相当于还是函数
    val prt = println(_)
    prt(1)
    l1.foreach(prt)
  }
}

filter

object FilterDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    //过滤出符合条件的
    val l2: List[Int] = l1.filter(x => x > 1)
    val l3: List[Int] = l1.filter(_>1)
  }
}

flatten

object FlattenDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(List(1,2), List(1,3), List(1,2), List(1,2))
    //拍平 
    //降维 List(1, 2, 1, 3, 1, 2, 1, 2)
    val flatten = l1.flatten
    println(flatten)
  }
}

flatMap

object FlatMapDemo {
  def main(args: Array[String]): Unit = {
    val l1: List[String]  = List("hello world","hello hello","haha kkk")
    val l2: List[String] = l1.map(x=>x.split(" ")).flatten
    //确保flatMap返回是一个集合
    //等价于 map+flatten
    val l3: List[String] = l1.flatMap(x=>x.split(" "))
  }
}

reduce

object ReduceDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    println(l1.reduce(_ + _))
  }
}

fold

object FlodDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    //fold折叠
    //解决的reduce 最后结果类型单一化
    //fold =====>foldLeft
    val res = l1.foldLeft("==")((x,y)=>x+y)
    println(res)


    val res1 = l1.foldRight("==")((x,y)=>x+y)
    println(res1)

    //==1234
    //1234==
  }
}
object FoldDemo2 {
  def main(args: Array[String]): Unit = {
    val map1 = Map("1" -> 1, "2" -> 2)
    val map2 = Map("1" -> 10, "3" -> 9)

      //合并两个map value相加
    val map3 = map1.foldLeft(map2)((m, x) => {
      m + (x._1 -> (m.getOrElse(x._1, 0) + x._2))
    })
    println(map3.mkString(","))
//    1 -> 11,3 -> 9,2 -> 2
  }
}

groupBy

object GroupDemo {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4)
    val map = l1.groupBy(_%2)
    
    println(map)
    //Map(1 -> List(1, 3), 0 -> List(2, 4))
  }
}

Sort

class User(val name: String, val age: Int) extends Comparable[User] {
  override def compareTo(o: User): Int = name.compareTo(o.name)
}

class User2(val name: String, val age: Int) extends Ordered[User2] {
  override def compare(that: User2): Int = name.compareTo(that.name)
}

object Sort1 {
  def main(args: Array[String]): Unit = {
    val l1 = List(1, 2, 3, 4, 9, 7, 5, 8)

    //sorted排序
    //默认升序
    //生成新对象
    l1.sorted

    //反转
    l1.sorted.reverse

    //复杂对象排序
    val l2 = List(new User("2", 2), new User("1", 1), new User("3", 3))

    l2.sorted
    l2.sorted.reverse
    val u1 = new User("2", 2)
    val u2 = new User("1", 1)
    u1.compareTo(u2)


    val l3 = List(new User2("2", 2), new User2("1", 1), new User2("3", 3))
    l3.sorted
    l3.sorted.reverse
    val u3 = new User2("2", 2)
    val u4 = new User2("1", 1)
    u3.compareTo(u4)
    //没有==
    val bool1 = u3 > u4
    val bool2 = u3 < u4
    val bool3 = u3 >= u4
    val bool4 = u3 <= u4

    l1.sorted(Ordering.Int)
    //反转 ,比的时候反转
    l1.sorted(Ordering.Int.reverse)

    //复杂对象

    l2.sorted(new Ordering[User] {
      override def compare(x: User, y: User): Int = x.age - y.age
    })
    //或者使用使用隐式值也可以
    implicit val order = new Ordering[User2] {
      override def compare(x: User2, y: User2): Int = x.age - y.age
    }

    //=====================================
    //sortedBy
    //得到新的集合
    val l5 = l1.sortBy(x => x)
    //函数返回什么就按什么排序
    val l6 = l1.sortBy(x => x.toDouble)
    //指定Ordering 函数柯里化
    l2.sortBy(_.age)(Ordering.Int.reverse)

    //先按照name升序,再按照age降序
    //弄成元组 最多到Tuple9
    l2.sortBy(x => (x.name, x.age))(Ordering.Tuple2(Ordering.String, Ordering.Int.reverse))

    //====================================
    //sortWith
    //定制性更强
    //升序
    l2.sortWith((x, y) => x.age < y.age)
    l2.sortWith(_.age < _.age)

  }
}

18集合操作
https://jiajun.xyz/2020/11/16/scala/18集合操作/
作者
Lambda
发布于
2020年11月16日
更新于
2021年8月5日
许可协议