• 2scala集合


    1、集合的数据结构:

        array、seq 、set 、map(映射)

    2、集合分类

      集合分为可变集合和不可变集合(除元组外,元组没有可变和不可变)

      scala.collection.immutable : 不可变集合的包
      scala.collection.mutable : 可变集合的包

    3、集合初始化

        不可变集合:
    val s
    = Array[Int](10) val s = Array[String]("Hello","World") val s = List[Int](1, 2, 3, 4) val s = Set[Int](1,2,4) val s = Map("Ali" -> 10, "Bob" -> 3, "City" -> 8); val s = Map(("Ali", 10), ("Bob", 3), ("City", 8));
    可变集合:
    val b
    = scala.collection.mutable.ArrayBuffer[Int]() val b = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4) val b = scala.collection.mutable.Set(1,2,3) val b = scala.collection.mutable.Map[String,Int]() val b = scala.collection.mutable.Map("Ali" -> 10, "Bob" -> 3, "City" -> 8)
    注:系统默认是不可变集合,如果是可变,必须前面加包名

    4、集合的公共操作

     4.1、迭代(遍历)

          一共三种方法:iterator、for、foreach

            val coll= . . .                                //coll是一个集合、            
            val iter = coll.iterator 
            while (iter.hasNext) {
                 iter . next ()
            }
    
            for (elem <- coll) {    }                        //如果是map,则应该: for ((k,v) <-  coll) {   }
    
            List(1,2,3).iterator.foreach( println(_) )            //foreach 是Iterator上的方法

     4.2、转化

           val coll= . . .                     //集合都是可以互相转化的
            coll.toSeq                  
            coll.toSet
            coll.toMap
            coll.toArray                        //转化为不可变数组Array
            coll.toBuffer                        //转化为可变数组ArrayBuffer

     4.3、增删(++,- -)

           val list  = List(1, 2, 3, 4)                    //以list举例,其余的都可以    
            val list2 = list ++ list
            
            注:不可变集合通过将结果赋值给另一个变量实现增,但是不能实现删

         val listBuffer
    = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4) //以list举例,其余的都可以 listBuffer -= 4 listBuffer += 4 listBuffer ++= listBuffer //等价于listBuffer = listBuffer ++ listBuffer listBuffer --= listBuffer //等价于listBuffer = listBuffer -- listBuffer listBuffer = listBuffer ++ listBuffer 注:++、--是操作的集合,+、-是针对某一元素

    5、Iterable 特质的重要方法(所有)         


    sum | product | max | min            //和,乘积,最大值,最小值
    head & last & headOption & lastOption        //返回第(最后)一个元素,但是如果集合没有元素,head 会抛出异常,但是headOption会返回none eg : var coll = Map("A"->1, "B"->2, "C"->3) coll.head         //(A,1)


    tail & init               //返回除第(最后)一个的元素集合
    take(n) | drop(n) | splitAt() // take(n) | drop(n) <==>takeLeft(n) | dropLeft(n)。返回前n个元素,除前n个的其他元素,两组对偶 eg: var coll = Set(1, 2, 3, 4) coll.take(2)       //Set(1, 2) coll.drop(2)       //Set(3, 4) coll.splitAt(2)     //(Set(1, 2),Set(3, 4)) takeRight(n) | dropRight(n) //返回最后n个元素,除最后n个的其他元素,两组对偶 slice(from, to)      //返回位于从from开始到to结束这个区间内的所以元素 eg:var coll = Set(1, 2, 3, 4) coll.slice(0,2) //Set(1, 2) grouped       //将集合分为两个

    eg:val xs = List(1, 2, 3, 4, 5, 6, 7, 8, 9) xs.grouped(4).foreach(println) //List(1, 2, 3, 4),List(5, 6, 7, 8),List(9)

    mkString(before,between,after)、addString(sb, before, between, after) //转化为字符串 eg : var coll = List("a", "b", "c") coll.mkString("<","-",">") //<a-b-c> map(f) | foreach(f) | flatMap(f) | collect(pf) //将函数f应用到所有元素 注:flatMap和map的区别: val arr = ["a b","c d"] val arr2 = arr.flatMap (x => x.split(" ") ) //扁平化:["a","b","c","d"] val arr3 = arr.map (x => x.split(" ") ) //[["a","b"],["c","d"]]

    count(pred) | forall(pred) | exists(pred) //返回满足时提前表达式的元素计数,所有元素满足时返回true,至少一个元素满足是返回true eg : var coll = Set(1, 2, 3, 4) coll.count(_<3) //2 filter(pred) | filterNot(pred) | partition(pred) //返回所有满足前提表达式的元素,所有不满足的元素,两组元素组成的对偶 takeWhile(pred) | dropWhile(pred) | span(pred) //和上面一样,只不过遇见第一个不满足,就不扫描了 eg : var coll = Set(1, 3, 2) coll.filter(_<3) //Set(1) coll.takeWhile(_<3) //Set(1, 2) coll.partition(_<2) //(Set(1,2),Set(3)) coll.span(_<2) //(Set(1),Set(3, 2)) reduceLeft 、reduceRight //reduceLeft <==> reduce。reduceLeft将结果作为左边参数,还有 (1 to 9) . reduceLeft( _ * _) //1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 arr.reduceLeft((a,b) => if (a > b) a else b //找出最大值 foldLeft : //foldLeft <== > fold。其实和reduceLeft差不多,只不过增加了初始值 List (1, 7, 2, 9). foldLeft (0) (_ * _) //0*1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 zip(coll2) | zipAll(coll2,fill,fill2) //返回由本集合元素和另外一个集合的元素组成的对偶,当长度不一致时,进行填充 var coll = List("a", "b") var coll2 = List(1, 2) coll.zip(coll2) //List(("a",1),("b",1)) 注: coll.filter(_<3) 等价于coll.filter(x => x <3) coll.filter(_+_) //_只是匹配参数,第二个_表示第二个参数,但是没有第二个参数,所以这写法是错误的,一般推荐第二种 coll.filter(x => x + x) //把参数变为x,可以无限使用

    6、Seq特质的重要方法(list、array)

                reverse                                //倒置序列
                contains(elem)、containsSlice(seq)、startsWith(seq)、endsWith(seq)        //返回true,如果该序列:包含给定元素、包含给定序列、以给定序列开始、以给定序列结束
    
                padTo(n,fill)                            //返回当前序列的一个拷贝,将fill的内容向后追加,直到新序列长度达到n
                    eg:    val list2 = List(8,9)
                        val list = List(1,3,4,23,4,5)
                        list.padTo(5,list2)                    //List(1, 3, 4, 23, 4, 5)
    
                indexWhere(pred)                        //满足表达式的第一个元素索引
                    eg :          val list = List(1,3,4,23,4,5,6,7,8,1,23)
                        list.indexWhere(_>20)                //3
                
                indexOf(elem)、lastIndexOf(elem)、indexOfSlice(seq)、lastIndexOfSlice(seq)    //返回给定元素或序列在当前序列中的首次或末次出现的下标
    
                intersect(seq)、diff(seq)                        //交集和序列之间的差异。
    
                    eg :    val list2 = List(8,1,23,9)
                        val list = List(1,3,4,23,4,5)
                        list.intersect(list2)                    //List(1, 23)
                        list.diff(list2)                    //List(3, 4, 4, 5)    
    
                sorted, sortWith(less), sortBy(f)                     //默认排序,二元函数排序、自定义函数排序
    
                    eg:         "Mary had a" . split (" ").sortWith(_. length< _.length)    //Array ("a ", "had","Mary")

    7、线程安全的集合

        SynchronizedBuffer
        SynchronizedMap
        SynchronizedPriorityQueue
        SynchronizedQueue
        SynchronizedSet
        SynchronizedStack

          注:方法还是大同小异,只不过是线程安全,但是速度慢,一般都是用线程不安全的集合

    8、List、set

                val set = Set(1,2,4)
                val set = scala.collection.mutable.Set(1,2,3)      //初始化
    val list
    = List(1, 2, 3, 4) val ListBuffer = scala.collection.mutable.ListBuffer[Int](1, 2, 3, 4) //List 增加了Nil(空表)、:: (等价于+:)、:::(等价于++:)的概念 //::操作单个元素,:::操作集合 val a= 9 : : List(4)   //a = List(9,4) val a = 9 : : 4 : : Nil //最右边必须是集合,不能val a= 9 : : 4 : : 2,所以加空表 val b = a ::: a 改写 :val b = a ++: a //但是不推荐改写 //因为底层是链表,还增加了首尾增加元素,了解 val a= 9 +: List(4, 2) //(9,4,2) var b = List(4, 2) :+ 9 //(4,2,9)

    9、数组

        ①不可变数组:Array
        —————————————————————————————————————————————————————————
            val s=  Array[Int](10)                
            val s = Array[String]("Hello","World")
    
            s(0) = "GoodBye"                     //改,推荐使用
        —————————————————————————————————————————————————————————
        ②可变数组:ArrayBuffer
        —————————————————————————————————————————————————————————
            val b = scala.collection.mutable.ArrayBuffer[Int]()
    
            b.insert(1, 6)                    //在下标为1的地方增加一个元素6
            b.remove(2);                    //移除下标为2的元素
            b.remove(2,2);                    //从下标为2的地方开始,移除两个元素
        
            注:因为数组有顺序,多了指定位置增删,insert,remove
        —————————————————————————————————————————————————————————
        ③常用方法:max、min、mkstring 、reverse
        —————————————————————————————————————————————————————————
               val arr = Array(1,2,3,4,5,6)
               println(arr.max)
               println(arr.min)
               println(arr.mkString)            //123456
               println(arr.mkString("|"))            //1|2|3|4|5|6
               println(arr.mkString("[", "|", "]"))        //[1|2|3|4|5|6]
               println(arr.reverse)                //Array(1,2,3,4,5,6)-->Array(6,5,4,3,2,1)

    10、Map(映射)

        ①不可变映射:
        ——————————————————————————————————————————————————————————
            val s = Map("Ali" -> 10, "Bob" -> 3, "City" -> 8);        //初始化
            val s = Map(("Ali", 10),  ("Bob", 3),  ("City", 8));
    
            val aLi = s("Ali")
            val aLi = s.getOrElse("Ali",0)                //如果不存在返回0,推荐使用
    
            for (i <- map.keySet) {                //keyset、values方法
                     println(i);
                }
    
                map.values                    
        —————————————————————————————————————————————————————————
        ②可变映射
        —————————————————————————————————————————————————————————
            val s = scala.collection.mutable.Map[String,Int]()                        //初始化
            val s = scala.collection.mutable.Map("Ali" -> 10, "Bob" -> 3, "City" -> 8)
            
            s("Ali") = 10
        
            s += ("Dog" -> 12, "Esi" -> 10)                            //可变集合的增删举例        
            s - = "Ali" 
        —————————————————————————————————————————————————————————
        ③排序映射
        —————————————————————————————————————————————————————————
            val scores = scala .collection .mutable.SortedMap (”Alce " - > 10, ” Fred" - > 7, ” Bob” - > 3 , ”Cndy” -> 8) 
            //默认会按字典排序,就是说你遍历时候,会按字典排序出来(字典排序:unicode的字符集的前后位置)
    
            val months = scala . collection .mutable.LinkedHashMap (” January" > 1, ” February ” -> 2, “. . . ) 
            //默认会按输入值的排序    

    11、Tuple(元组)

        元组虽属于集合,但是以上的规律,增删都不适用。
    
        val t1 = ("小明", "男", 23)
    
            println(t1._1 + ":" + t1._2 + "-" + t1._3)
    
        val arr1 = Array("a", "b", "c")
           val arr2 = Array("A", "B", "C")
    
           val tuple = arr1 zip arr2            //拉链操作  ((a,A), (b,B), (c,C))
  • 相关阅读:
    js日期时间补零
    判断交换机性能好坏的九个因素
    [转]document.getElementById("...") is null
    ABAP数据库操作之操作语句Insert
    abap对excel处理
    选择屏幕搜索帮助
    Screen返回选择界面的问题
    ABAP 的TABLE CONTROL实践积累
    ALV的双击使用
    双击ALV调用事务代码并传入参数
  • 原文地址:https://www.cnblogs.com/lihaozong2013/p/10580890.html
Copyright © 2020-2023  润新知