今天看啥  ›  专栏  ›  隐约喜欢萌萌哒

2020-10-30-Scala-19(数组/集合的补充)

隐约喜欢萌萌哒  · 简书  ·  · 2020-11-01 12:12

1.数组(注意变长数组添加元素的方法)

object Test1 {
  def main(args: Array[String]): Unit = {
    //定长数组的声明
    var array = Array(1, 2, 3)
    var array1 = Array[Any]("1", 1, true)
    var array2 = new Array[Double](10) //初始容量为10
    //定长数组的反转
    val reverse = array.reverse
    for (index <- reverse) {
      println(index)
    }
    //与java不同是访问数组的元素语法 array(index)

    //变长数组的声明与操作
    var arraybuffer = new ArrayBuffer[Any]()
    //添加add方法,在末端添加
    arraybuffer += 1 //添加元素1
    arraybuffer += (11, 22, 33) //添加多个
    arraybuffer ++= array //添加集合
    println(arraybuffer) //ArrayBuffer(1, 11, 22, 33, 1, 2, 3)
    //
    arraybuffer.insert(2, 222) //这里不能添加多个元素???  在索引2后添加元素
    println(arraybuffer) //ArrayBuffer(1, 11, 222, 22, 33, 1, 2, 3)

    //其他方法例如:trimend 数组之间的转换
    //多维数组的声明与遍历
    var array3 = Array.ofDim[Int](4, 4) //四行四列同java
    array3(1)(1) = 1
    var array4 = Array(Array(), Array()) //
    for (index <- array3) {
      for (inde <- index) {
        print(inde)
      }
      println()
    }
  }
}

2.List集合

注意 take drop splitat 方法...

  def main(args: Array[String]): Unit = {
    //List集合
    //说明:底层是链表
    //list集合有两大特性:同构,同一个list的元素必须是同一类型; 协变,如果S是T的子集 则 List[S] 是 List[T] 的子集
    //构建list,原来集合不发生变化
    var list = List("hello", "world")
    var list2 = "hadoop" :: "MapReduce" :: list :: Nil
    // println(list2)//List(hadoop, MapReduce, List(hello, world))
    var list3 = "java" :: "scala" :: list2 ::: Nil //把list1集合打散...注意:::两边必须都要是集合
    // println(list3)//List(java, scala, hadoop, MapReduce, List(hello, world))
    var list1 = "hhh" :: list
    //println(list1) //List(hhh, hello, world)
    list1 = list1 :+ "哈哈哈"
    // println(list1)
    var list4 = list1 +: "jjj" //发现直接赋值给list1竟然不行????
    // println(list4) //Vector(List(hhh, hello, world, 哈哈哈), j, j, j)
    list1 = "哈哈哈" +: list1
    // println(list1) //List(哈哈哈, hhh, hello, world, 哈哈哈)


    //常用操作 以list2为例子
    //println(list2.isEmpty)//判断是否为空
    //head tail init last 方法
    // println(list2.head)//返回第一个元素
    // println(list2.tail)//返回第一个元素之后的元素
    // println(list2.tail.head)//返回第二个元素
    // println(list2.init)//返回,和tail反向
    // println(list2.last)//返回最后一个元素
    //反转集合
    // println(list2.reverse)
    //返回下标
    println(list2.indices) //Range 0 until 3
    //take drop splitat
    println(list2 take (2)) //获取前2元素
    println(list2 splitAt (2)) //从第几个元素开始拆分...原来的集合不变
    // val tuple = list2.splitAt(2) (List(hadoop, MapReduce),List(List(hello, world))) 返回的是一个元组
    println(list2.drop(2)) //从第几个元素删除 ,原来集合不发生改变,重新生成一个集合
  }
}

注意mkString方法

object Test3 {
  def main(args: Array[String]): Unit = {
    //list集合操作二
    var list = List(List(1, 2), List(3, 4), List(5, 6))
    //flatten
   // println(list.flatten)//List(1, 2, 3, 4, 5, 6) 扁平化返回一个列表
    //zip和unzip方法  zip(拉链)
    var list1 = List[Int](1,2,3)
    var list2 =List[String]("hadoop","hive")
    val value = list1.zip(list2)//List((1,hadoop), (2,hive)) 组成对偶元组,如果不对称就会发生数据丢失
   // println(value)
    val unzip = value.unzip
   // println(unzip)//是zip的反向操作

    //mkString()方法 ,mkString三种重载方法改变字符串的形式
    var s1 = List("java","scala","JavaScript")
    println(s1)//List(java, scala, JavaScript)
    val str = s1.mkString(",")
    println(str)//java,scala,JavaScript
    val str1 = s1.mkString("{", ":", "}")
    println(str1)//{java:scala:JavaScript}  说明:前缀,分隔符,后缀
    val str2 = s1.mkString
    println(str2)//javascalaJavaScript

   //迭代器
   var s2 =List(List(1,2),List(3,4),List(5,6))
    val iterator = s2.iterator
    while (iterator.hasNext) {
         println(iterator.next())
    }
   //toarray 和 tolist  数组和集合之间的转换 
   //copytoarray方法 把list元素拷贝到array指定位置
  }
}

list的高级操作
map flatmap foreach 方法

object Test4 {
  def main(args: Array[String]): Unit = {
    //list集合
    //map flatmap  方法的比较

    var list = List(List(1, 2, 3), List(4, 5), List(6, 7))

    // println(list.map(_.toString() + 10)) //List(List(1, 2, 3)10, List(4, 5)10, List(6, 7)10)
    //发现使用下面的方法为空,怎么解决???
    // println(list.map(data=>data.map(data=>data+10)))//List(List(11, 12, 13), List(14, 15), List(16, 17))
    //两个例子用于比较map 和 flatMap 的区别
    //println(list.map(data => data.toList))//List(List(1, 2, 3), List(4, 5), List(6, 7))
    //println(list.flatMap(data => data.toList))//List(1, 2, 3, 4, 5, 6, 7)
    // foreach 方法
    var sum = 0
    //println(list.map(data => data.foreach(data => sum += data)))//求和
    // println(list.foreach(data => data.foreach(data => sum += data))) //求和
    println(sum) //求和
  }
  def fun(list: List[Int]): List[Int] = {
    var list1 = ListBuffer[Int]()
    for (index <- list) {

      list1 :+ (index + 10)
    }
    list1.toList
  }
}

Option()集合??

object Test5 {
  //过滤方法
  //Option(Int)
  def main(args: Array[String]): Unit = {
    var list = List(1, 2, 3, 4, 5, 6, 7)
    //filter方法 过滤判断
    //println(list.filter(data=>data%2==0))//List(2, 4, 6)
    //partition()按照筛选条件进行分组,返回的类型是元组
    // println(list.partition(_%2==1))//(List(1, 3, 5, 7),List(2, 4, 6))  返回的是一个元组,元组中是list集合
    //find方法,返回第一个满足条件的值,对于list集合可以使用getorelse()来给一个默认值
    val maybeInt = list.find(_ % 3 == 1) //Option(Int)
    // println((maybeInt.getOrElse(10, 0)))//1

    //三者的区别:takewhile遍历元素直到不符合条件,返回所有遍历的值,dropwhile相反返回未遍历的值,span方法综合两者生成一个元组
    println(list.takeWhile(_ < 5)) //List(1, 2, 3, 4)
    println(list.dropWhile(_ < 5)) //st(5, 6, 7) 
    println(list.span(_ < 5)) // (List(1, 2, 3, 4),List(5, 6, 7))
  }
}

注意比较方法

object Test6 {
  def main(args: Array[String]): Unit = {
    //列表 的检查:forall方法元素都满足条件者返回true exists方法只要有一个元素满足条件则返回true
    //list排序 sortwith方法 由于list是不可变的返回一个新的list
    var list = List(2, 3, 4, 66, 22, 11, 1)
    println(list.sortWith((s1, s2) => {
      s1>s2
    }))
    //反思java中自然排序和定制排序
    var list1 =List("11","111","1","999")
    println(list.sortWith((s1, s2) => {
      s1.toInt < s2.toInt
    }))
  }
}

3.set集合

略......

4.Map

object Test7 {
  def main(args: Array[String]): Unit = {
    //map
    //map的构建
    var map1 = Map((1, 2), (2, 3), (3, 4))
    var map2 = Map(1 -> 1, 2 -> 2, 3 -> 3)
    // var map3 =new Map[String,Int]..没有这种写法
    var map4 = new mutable.HashMap[String, String]
   // println(map1)
   // println(map2)
    // println(map3)
   // println(map4)
    //map的取值的四种方法
   // println(map1(1)) //直接传入key,如果没有这个key就会报错
    if (map1.contains(1)) {
     // println(map1(1))
    }
   // println(map1.get(1).get) //获取key1
   // println(map1.getOrElse(1, 0)) //第二个参数的默认值,如果不存在这个key,则使用默认值代替
    //同list一样map也有可变和不可变map
    //对map的增删改
    var map5 =mutable.Map("1"->"小明",1->"西华",'c'->Nil)
    println(map5)
    //存在则更新不存在则添加
    map5(1) = "火神盾"
    map5("1")="存储"
    map5(2)=Nil
    println(map5)
    //可以通过+= 和 -= 来添加可删除元素
    //map集合不可变 但是允许相同的操作生成一个新的map
    //遍历map的三种方法
    for(k<-map5.keys){println(map5(k))}
    for(v<-map5.values){println(v)}
    for ((k,v)<-map5){println(k + " " + v)}
  }
}

yield方法

object Test8 {
  def main(args: Array[String]): Unit = {
    //map  yield 方法从现有map生成一个新的map
    var map1 = Map(1 -> 1, 2 -> 2, 3 -> 3, 4 -> 4)
    val map2 = for ((k, v) <- map1) yield (k, v - 1)
    println(map2)
    var map3 = for ((k, v) <- map1) yield (v, k)
    println(map3)
  }
}



原文地址:访问原文地址
快照地址: 访问文章快照