Kotlin-2数组与列表

Kotlin学习 —— 2.数组与列表

1. 数组Array

数组用类 Array 实现,可以采用[]和get/set的两种方式进行访问修改。Kotlin中的数组是不能型变的,也就是说Array不能赋值给Array

定义方式:arrayOf()、工厂函数

操作:array[index]=value,array.set(index,value)

常用方法:

  1. copyOf()//复制,返回一个数组

  2. reverse()//反转

  3. reversed()//反转,返回一个反转后的列表

  4. plus(element)//添加内容(子项或数组),返回一个添加后的数组。本质是新建一个n+1的数组,复制后并返回

  5. fill(element,start,end)//修改start到end的子项为element,不包括end

  6. asList()//返回一个List,对数组操作会影响到list

  7. toList()//复制并返回一个list,对数组操作不会影响到list

  8. toMutableList()//复制并返回一个可变list,与toList()的区别看源码

     public fun <T> Array<out T>.toList(): List<T> {
         return when (size) {
             0 -> emptyList()
             1 -> listOf(this[0])
             else -> this.toMutableList()
         }
     }
    

举个栗子:

fun testArray() {
    //定义时初始化
    val students = arrayOf("Tom","Jerry","Ryan")
    for (student:String in students){
        LogUtil.e(student)
    }
    LogUtil.e("-------------------------------------------")
    //先定义(需要传大小)后添加
    val students1 = arrayOfNulls<String>(4)//值全为null,即使是Int或其它类型,值还是null
    students1[0] = "Tom"//赋值
    students1[1] = "Jerry"
    students1[2] = "Ryan"
    for (student: String? in students1) {
        LogUtil.e(student)
    }
    LogUtil.e("-------------------------------------------")
    //工厂函数定义
    val student2 = Array(3){ k-> "结果:$k"}
    for (student: String in student2) {
        LogUtil.e(student)
    }
}

二维数组:val arr2 = Array(3){Array(3)}

三维数组:val arr3 = Array(3){Array(3){Array(3){}}}

多维数组:val arr = Array(x){…}//多层嵌套

自定义数组:

    val arrClass = arrayOf(
        arrayOf(UserBean(1),2),
        arrayOf("3",false),
        arrayOf(5f,6.55)
    )

2. 列表List

列表分为可变列表不可变列表

定义方式:

  1. listOf()不可变,返回一个List,可通过 toMutableList() 转换为可变的
  2. mutableListOf()可变,返回 MutableList
  3. arrayListOf()可变,返回 ArrayList

2、3区别:ArrayList 继承 MutableList,RandomAccess,就像Java中的 List 和 ArrayList

常用方法:与java基本一致,可通过 toTypedArray() 转换为数组

举个栗子:

fun testList() {
    var list1 = listOf("1","2","3")
    var list2 = mutableListOf("1","2","3")
    var list3 = arrayListOf("1","2","3")
    list2.add("a")
    list3.remove("2")
    list3.set(1,"a")
}

//scan()列表值累加
//scan()等方法是实验性的 ExperimentalStdlibApi
val strings = listOf("a", "b", "c", "d")
println(strings.scan("s") { acc, string -> acc + string }) // [s, sa, sab, sabc, sabcd]
println(strings.scanIndexed("s") { index, acc, string -> acc + string + index }) // [s, sa0, sa0b1, sa0b1c2, sa0b1c2d3]

scan()相关资料

3. Set

不重复,可用与去重。分为可变不可变

定义方式:

fun testSet(){
    var set = setOf("a","b")            //返回-不可变-Set
    var set1 = emptySet<String>()       //返回-不可变-Set
    var set2 = mutableSetOf<String>()   //返回-可变-LinkedHashSet
    var set3 = hashSetOf<String>()      //返回-可变-HashSet
    var set4 = linkedSetOf<String>()    //返回-可变-LinkedHashSet
    var set5 = sortedSetOf<String>()    //返回-可变-TreeSet
    for (value in set) {
        LogUtil.e("value = $value")
    }
}

常用方法:与java基本一致,可通过 toList()、toMutableList() 转换为包含key-value的list

public fun <T> Iterable<T>.toList(): List<T> {
    if (this is Collection) {
        return when (size) {
            0 -> emptyList()
            1 -> listOf(if (this is List) get(0) else iterator().next())
            else -> this.toMutableList()
        }
    }
    return this.toMutableList().optimizeReadOnlyList()
}

public fun <T> Collection<T>.toMutableList(): MutableList<T> {
    return ArrayList(this)
}

4. Map

key-value存储方式,key唯一,value可重复,分为可变不可变

定义方式:

fun testMap(){
    var map = mapOf<String,String>("key1" to "value1","key1" to "value2","key2" to "value1")
    var map1 = emptyMap<String,String>()        //返回-不可变-LinkedHashMap
    var map2 = mutableMapOf<String,String>()    //返回-可变-LinkedHashMap
    var map3 = hashMapOf<String,String>()       //返回-可变-HashMap
    var map4 = linkedMapOf<String,String>()     //返回-可变-LinkedHashMap
    var map5 = sortedMapOf<String,String>()     //返回-可变-TreeMap
    for (key in map.keys) {
        LogUtil.e("key = $key,value = ${map[key]}")
    }
    for ((key,value) in map){
        LogUtil.e("key = $key,value = $value")
    }
}

mapOf() 和 mutableMapOf() 都是返回 LinkedHashMap ,为避免以后出现问题,所以一般用 hashMapOf()linkedMapOf()

常用方法:与java基本一致,可通过 toList() 转换为包含key-value的list

public fun <K, V> Map<out K, V>.toList(): List<Pair<K, V>> {
    if (size == 0)
        return emptyList()
    val iterator = entries.iterator()
    if (!iterator.hasNext())
        return emptyList()
    val first = iterator.next()
    if (!iterator.hasNext())
        return listOf(first.toPair())
    val result = ArrayList<Pair<K, V>>(size)
    result.add(first.toPair())
    do {
        result.add(iterator.next().toPair())
    } while (iterator.hasNext())
    return result
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值