kotlin学习笔记(4)--容器(集合)

1.容器类型

Kotlin号称全面兼容Java,于是乎Java的容器类仍可在Kotlin中正常使用,包括大家熟悉的队列ArrayList、映射HashMap等等。不过Kotlin作为一门全新的语言,肯定还是要有自己的容器类,不然哪天Java跟Kotlin划清界限,那麻烦就大了。与Java类似,Kotlin也拥有三类基本的容器,分别是集合Set、队列List、映射Map,然后每类容器又分作只读与可变两种类型,这是为了判断该容器能否进行增删改等变更操作。Kotlin对修改操作很慎重,比如变量用val前缀表示不可修改,用var前缀表示允许修改;类默认是不允许继承的,只有添加open前缀才允许该类被继承;至于容器默认为只读容器,如果需要进行修改则需加上Mutable形成新的容器,比如MutableSet表示可变集合,MutableList表示可变队列,MutableMap表示可变映射。

既然Set/List/Map都属于容器,那么必定拥有相同的基本容器方法,具体说明如下:
isEmpty : 判断该容器是否为空。
isNotEmpty : 判断该容器是否非空。
clear : 清空该容器。
contains : 判断该容器是否包含指定元素。
iterator : 获取该容器的迭代器。
count : 获取该容器包含的元素个数,也可通过size属性获得元素数量。
初始化赋值 : Kotlin允许在声明容器变量之时进行初始赋值,这点很方便比Java先进,当然不同容器的初始化方法有所区别,具体的对应关系见下表:
只读集合Set    setOf
可变集合MutableSet    mutableSetOf
只读队列List    listOf
可变队列MutableList    mutableListOf
只读映射Map    mapOf
可变映射MutableMap    mutableMapOf
以上是Kotlin容器的基本方法,更具体的增删改查等用法则有所不同,下面分别介绍这三类六种容器的详细用法。

2.List类型

List是一种元素之间按照顺序排列的容器,它与集合的最大区别,便是多了个次序管理。正因为List建立了秩序规则,所以它比Set多提供了如下功能(注意凡是涉及到增删改的,都必须由MutableList来完成):
1、队列的get方法能够获取指定位置的元素,也可直接通过下标获得该位置的元素。
2、MutableList的add方法每次都是把元素添加到队列末尾,也可指定添加的位置;
3、MutableList的set方法允许替换或者修改指定位置的元素;
4、MutableList的removeAt方法允许删除指定位置的元素;
5、MutableList提供了sort系列方法用于给队列中的元素重新排序,其中sortBy方法表示按照升序排列,sortByDescending方法表示按照降序排列;

//空值判断
List?:List 本身可空,List 的元素不可空
List :List 本身不可空,List 的元素可空
List? :List 本身可空,List 的元素也可空

对于List的遍历操作:for循环,迭代器循环,forEach循环,以及下标遍历。用法如下:

fun main(args: Array) {
    val mylist:MutableList = mutableListOf("联想","联想 Y520","惠普","戴尔","IBM","长城","方正","联想 Y720","联想 Y7000");
    print("电脑畅销榜已添加,当前共有${mylist.size}款电脑\n")

    print("for-in 电脑畅销榜包含以下${mylist.size}款电脑\n")
    for(item in mylist){
        print("名称:${item}\n")
    }

    //删除第二个元素
    if(mylist.size>=2){
        mylist.removeAt(1);
    }
    print("removeAt电脑畅销榜已更新,当前包含以下${mylist.size}款电脑\n")
    print("for-in 电脑畅销榜包含以下${mylist.size}款电脑\n")
    for(item in mylist){
        print("名称:${item}\n")
    }

    mylist.sortBy { it.first() }
    print("for-in sort电脑畅销榜已按照it升序重新排列,包含以下${mylist.size}款电脑\n")
    for(item in mylist){
        print("名称:${item}\n")
    }

    mylist.sortByDescending { it.first() }
    print("for-in sort电脑畅销榜已按照it降序重新排列,包含以下${mylist.size}款电脑\n")
    for(item in mylist){
        print("名称:${item}\n")
    }

    print("iterator-while 电脑畅销榜包含以下${mylist.size}款电脑\n")
    var iter = mylist.iterator()
    while(iter.hasNext()){
        print("名称:${iter.next()}\n")
    }

    print("foreach 电脑畅销榜包含以下${mylist.size}款电脑\n")
    mylist.forEach {
        print("名称:${it}\n")
    }

    print("indices电脑畅销榜包含以下${mylist.size}款电脑\n")
    for(i in mylist.indices){
        print("名称:${mylist[i]}\n")
    }
}

3.Set类型

Set集合是一种简单的容器,它具有以下特性:
1、容器内部的元素不按顺序排列,因此无法按照下标进行访问;
2、容器内部的元素存在唯一性,通过哈希值校验是否存在相同的元素,如果存在则覆盖之;
因为Set是只读集合,初始化赋值后便不可更改,所以元素变更的方法只适用于可变集合MutableSet,但MutableSet的变更操作尚有以下限制:
1、MutableSet的add方法仅仅往集合中添加元素,由于集合是无序的,因此不知道添加的具体位置;
2、MutableSet没有修改元素值的方法,一个元素一旦被添加,就不可被修改;
3、MutableSet的remove方法用于删除指定对象,但无法删除某个位置的元素,这是因为集合内的元素不是按顺序排列的;

对于Set的遍历操作:for循环,迭代器循环,forEach循环,三种循环遍历的用法如下:

private val goodsA:String="惠普"
private val goodsB:String="联想"
private val goodsC:String="戴尔"
private val goodsD:String="IBM"
private val goodsE:String="长城"
private val goodsF:String="方正"
private val myset:MutableSet = mutableSetOf();
fun main(args: Array) {
    myset.add(goodsA)
    myset.add(goodsB)
    myset.add(goodsC)
    myset.add(goodsD)
    myset.add(goodsE)
    myset.add(goodsF)
    myset.remove(goodsA)
    print("电脑畅销榜已添加,并且remove goodsA商品惠普,当前共有${myset.size}款电脑\n")
    print("for-in 电脑畅销榜包含以下${myset.size}款电脑\n")
    print("for-in测试\n")
    for(item in myset){
        print(item+"\n")
    }

    print("iterator-while 电脑畅销榜包含以下${myset.size}款电脑\n")
    print("iterator测试\n")
    var iter = myset.iterator()
    while(iter.hasNext()){
        print(iter.next()+"\n")
    }

    print("foreach 电脑畅销榜包含以下${myset.size}款电脑\n")
    print("foreach测试\n")
    myset.forEach {
        print(it+"\n")
    }

    print("foreach\$拼接表达式电脑畅销榜包含以下${myset.size}款电脑\n")
    var dec=""
    myset.forEach {
        dec="${dec}名称:${it}\n"
    }
    print("$dec")
}

4.Map类型

映射内部保存的是一组键值对(Key-Value),也就是说,每个元素都由两部分构成,第一部分是元素的键,相当于元素的名字;第二部分是元素的值,存放着元素的详细信息。元素的键与值是一一对应的关系,相同的键名指向的值对象是唯一的,所以映射中每个元素的键名各不相同,这个特性使得映射的变更操作与队列存在以下不同之处(注意增删操作必须由MutableMap来完成):
1、映射的containsKey方法判断是否存在指定键名的元素,containsValue方法判断是否存在指定值对象的元素;
2、MutableMap的put方法不单单是添加元素,而是智能的数据存储;每次调用put方法,映射会先根据键名寻找同名元素,如果找不到就添加新元素,如果找得到就用新元素替换旧元素;
3、MutableMap的remove方法,是通过键名来删除元素的;
4、调用mapOf和mutableMapOf方法初始化映射之时,有两种方式可以表达单个键值对元素。其一是采取“键名 to 值对象”的形式,其二是采取Pair配对方式形如“Pair(键名, 值对象)”,下面是这两种初始化方式的代码例子:
//to方式初始化映射
var goodsMap = mapOf("苹果" to goodsA, "华为" to goodsB, "小米" to goodsC, "欧珀" to goodsD, "步步高" to goodsE, "魅族" to goodsF)
//Pair方式初始化映射
var goodsMutMap = mutableMapOf(Pair("苹果", goodsA), Pair("华为", goodsB), Pair("小米", goodsC), Pair("欧珀", goodsD), Pair("步步高", goodsE), Pair("魅族", goodsF))

遍历方式与Set相似,如下
fun main(args: Array) {
          var goodsMutMap=mutableMapOf(Pair("苹果", goodsA),Pair("华为", goodsB),Pair("戴尔", goodsC),Pair("华硕", goodsD),Pair("弘基",goodsE),Pair("联想", goodsE));
           for(item in goodsMutMap){
                  print("厂家:${item.key},名称:${item.value}\n");
           }
           //迭代器循环
           var iterator= goodsMutMap.iterator();
           while(iterator.hasNext()){
                  var item=iterator.next();
                  print("厂家:${item.key}名称:${item.value}\n")
           }
          //for each循环
          goodsMutMap.forEach{
                   print("厂家:${it.key},名称:${it.value}\n")
           }
}

你可能感兴趣的:(kotlin学习笔记(4)--容器(集合))