美文网首页
kotlin中List/Set/Map等集合(2)

kotlin中List/Set/Map等集合(2)

作者: Bfmall | 来源:发表于2022-11-04 18:32 被阅读0次

List/Set/Map等集合学习笔记###

/**
 * DESC   : List/Set/Map等集合
 */
class KtBaseCollectionTest02 {
    companion object{
        const val TAG = "KtBaseCollectionTest02"
    }

    /**
     * 不可变集合set
     * set: 无重复元素
     */
    fun testSet01() {
        val set = setOf<String>("mcm", "mlb", "mk")

        //testSet01==>element0=mcm, element1=mlb, element2=mk
        Log.d(TAG, "testSet01==>element0="+set.elementAt(0)
            +", element1="+set.elementAt(1)
            +", element2="+set.elementAt(2))

        //下面会出下标越界异常
        //Caused by: java.lang.IndexOutOfBoundsException: Collection doesn't contain element at index 5.
//        Log.d(TAG, "testSet01==>element5="+set.elementAt(5))


        //TODO TIP : 使用set集合,尽量使用elementAtOrElse和elementAtOrNull来避免崩溃

        //testSet01==>element0=mcm, element5=下标越界,品牌不存在
        Log.d(TAG, "testSet01==>element0="+set.elementAtOrElse(0) {"下标越界,品牌不存在"}
                +", element5="+set.elementAtOrElse(5) {"下标越界,品牌不存在"})

        //testSet01==>element0=mcm, element5=下标越界,品牌不存在
        Log.d(TAG, "testSet01==>element0="+set.elementAtOrNull(0)
                +", element5="+(set.elementAtOrNull(5) ?: "下标越界,品牌不存在"))

    }

    /**
     * 可变集合set,用法见list
     */
    fun testSet02() {
        val set = mutableSetOf<String>("mcm", "mlb", "mk")

        set += "mj"
        set += "mk"//集合中已经mk,再次加mk,会去重操作
        set -= "mcm"

        set.add("lv")
        set.remove("mlb")

        //testSet02==>set=[mk, mj, lv]
        Log.d(TAG, "testSet02==>set="+set)
    }

    fun testSet03() {
        //可变list(集合中具有重复元素"mcm")
        val list= mutableListOf("mcm", "mlb", "mk", "mcm")

        //第一种:list转成set,去重复元素
        val set = list.toSet()

        //testSet03==>list=[mcm, mlb, mk, mcm]
        Log.d(TAG, "testSet03==>list="+list)
        //testSet03==>set=[mcm, mlb, mk]
        Log.d(TAG, "testSet03==>set="+set)

        //第二种: list 转 set 再转回 list, 也能去重复元素
        val list2 = list.toSet().toList()
        //testSet03==>list2=[mcm, mlb, mk]
        Log.d(TAG, "testSet03==>list2="+list2)

        // 第三种: 快捷函数distinct去重
        /**
         * distinct函数内部实现,其实就是调用toMutableSet().toList()
         * public fun <T> Iterable<T>.distinct(): List<T> {
            return this.toMutableSet().toList()
            }
         */
        val list3 = list.distinct()
        //testSet03==>list3=[mcm, mlb, mk]
        Log.d(TAG, "testSet03==>list3="+list3)


        /**
         * list.toMutableSet().toList()实现方式于list.distinct()等价
         */
        val list4 = list.toMutableSet().toList()
        //testSet03==>list4=[mcm, mlb, mk]
        Log.d(TAG, "testSet03==>list4="+list4)

    }

    fun testArray01() {
        val arr = intArrayOf(1,2,3,4)

        //testArray01==>arr[0]=1, arr[1]=2, arr[3]=4
        Log.d(TAG, "testArray01==>arr[0]="+arr[0] +", arr[1]="+arr[1]
            +", arr[3]="+arr.elementAt(3))

        //下面会越界Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=5
//        Log.d(TAG, "testArray01==>arr[5]="+arr[5])

        //arr[3]=4, arr[5]=-1
        //下面的elementAtOrElse和elementAtOrNull可以避免下标越界异常
        Log.d(TAG, "arr[3]="+arr.elementAtOrElse(3) { -1 }
            +", arr[5]="+arr.elementAtOrElse(5) { -1 })

        //arr[2]=3, arr[5]=下标越界
        //elementAtOrNull + 空合并 ?:
        Log.d(TAG, "arr[2]="+arr.elementAtOrNull(2)
            +", arr[5]="+(arr.elementAtOrNull(5) ?: "下标越界"))
    }

    /**
     * map集合
     * 取值
     */
    @RequiresApi(Build.VERSION_CODES.N)
    fun testMap01() {
        //map的两种创建方式
        val map1 = mapOf<String, Double>(Pair<String, Double>("mcm", 3688.88), Pair("mk", 2888.88))
        val map2 = mapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)

        //testMap01==>map1.value1=3688.88, value2=2888.88, value3=null, value4=null
        //取值,方式一:通过[] 或 get取值,找不到会返回null, 背后对[]重载了
        Log.d(TAG, "testMap01==>map1.value1="+map1["mcm"] + ", value2="+map1.get("mk")
            +", value3="+map1["lv"] +", value4="+map1.get("mlb"))

        // testMap01==>map2.value1=3688.88, value2=2888.88, value3=0.0, value4=0.0
        //取值,方式二:getOrDefault,方式三: getOrElse
        Log.d(TAG, "testMap01==>map2.value1="+map2.getOrDefault("mcm", 0.0)
                + ", value2="+map2.getOrElse("mk"){0.0}
                +", value3="+map2.getOrDefault("lv", 0.0)
                +", value4="+map2.getOrElse("mlb"){0.0})

        //testMap01==>value1=3688.88
        //取值,方式四:通过getValue(key)传key取值
        Log.d(TAG, "testMap01==>value1="+map2.getValue("mcm"))

        //方式四如果取不到值,会报错
        // Caused by: java.util.NoSuchElementException: Key lv is missing in the map.
//        Log.d(TAG, "testMap01==>+value2="+map2.getValue("lv"))

    }

    /**
     * map集合
     * 遍历
     */
    @RequiresApi(Build.VERSION_CODES.N)
    fun testMap02() {
        val map = mapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)

        /**
         * testMap02==>方式一...key=mcm, value=3688.88
         * testMap02==>方式一...key=mk, value=2888.88
         */
        //方式一:有默认的it, it == Map.Entry<String, Double>
        map.forEach {
            //内部持有一个it,it == Map.Entry<String, Double>
            Log.d(TAG, "testMap02==>方式一...key=${it.key}, value=${it.value}")
        }

        //方式二:把默认的it 用key,value ->覆盖掉了
        map.forEach { s, d ->
            Log.d(TAG, "testMap02==>方式二...key="+s + " ," +d)
        }

        map.forEach {s : String ,d : Double  ->
            Log.d(TAG, "testMap02==>方式三...key="+s + " ," +d)
        }
    }

    /**
     * map可变集合
     * 可变集合的操作:+= -= put
     * 取值:getOrPut 有元素的情况和无元素的情况
     */
    fun testMap03() {
        val map = mutableMapOf<String, Double>("mcm" to (3688.88), "mk" to 2888.88)
        map += "mlb" to 699.8
        map += Pair("coach", 2988.8)
        map -= "mcm"
        map.put("ck", 888.88)

        /**
         * testMap03==>key=mk, value=2888.88
         * testMap03==>key=mlb, value=699.8
         * testMap03==>key=coach, value=2988.8
         * testMap03==>key=ck, value=888.88
         */
        //遍历
        map.forEach {
            Log.d(TAG, "testMap03==>key=${it.key}, value=${it.value}")
        }

        /**
         * 1. getOrPut 没有元素的情况
         * 如果map中没有fila元素,就先添加到map中,然后再从map中获取
         */
        val result /*: Double*/ = map.getOrPut("fila") {
            399.88
        }

        //testMap03==>result=399.88, 或这样取值:399.88
        //result值类型就是<K, V>中的V类型,result值就是value值
        Log.d(TAG, "testMap03==>result="+result+", 或这样取值:"+map["fila"])


        /**
         * 2. getOrPut 有元素的情况
         * 如果map中有mk元素,就直接获取,相当于默认值3333.33就失效了
         */
        val result2 /*: Double*/ = map.getOrPut("mk") {
            3333.33
        }

        //testMap03==>result2=2888.88
        Log.d(TAG, "testMap03==>result2="+result2)

    }
}

相关文章

网友评论

      本文标题:kotlin中List/Set/Map等集合(2)

      本文链接:https://www.haomeiwen.com/subject/vmgazrtx.html