ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ### set集合常见方法和属性 set集合可以理解为是一个容器,容器操作我们自然想到“增删改查”,可写集合才有“增删改查”,不可写集合只有“查”,这个点我们可以想到。但是set集合无序,所以没有“改查”,因为某个位置上是什么元素是不确定。 #### 添加元素:add、addAll ![](http://upload-images.jianshu.io/upload_images/7368752-5ca85ee73377e219.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 相比于list集合的添加,少了在指定位置添加单个元素和多个元素的方法,因为set集合是无序的,无法指定添加位置。 我们编写一个案例,验证下,参考代码: ~~~ fun main(args: Array<String>) { val set = hashSetOf(1, 2, 3) //追加元素 val isSuccess = set.add(4) println(set) println("添加元素成功:${isSuccess}") //批量添加一个集合 set.addAll(listOf(11, 22)) println(set) //批量添加一个数组 set.addAll(arrayOf(111, 222)) println(set) } ~~~ 运行结果 ``` [1, 2, 3, 4] 添加元素成功:true [1, 2, 3, 11, 4, 22] [1, 2, 3, 4, 22, 11, 222, 111] Process finished with exit code 0 ``` 针对以上代码,我们看到调用addAll方法后,**打印set集合的时候,元素变成了无序**。 #### 删除元素:remove、removeAll 删除元素,主要有如下几种方式: ![](http://upload-images.jianshu.io/upload_images/7368752-a0571e4b17a5fc95.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 相比于list,少了删除指定位置元素的方法 我们编写一个案例,验证下上面这些方法,参考代码: ~~~ fun main(args: Array<String>) { val set = hashSetOf(1, 2, 3) //追加元素 val isSuccess = set.add(4) println(set) println("添加元素成功:${isSuccess}") //批量添加一个集合 set.addAll(listOf(11, 22)) println(set) //批量添加一个数组 set.addAll(arrayOf(111, 222)) println(set) //删除指定元素 val isDelete = set.remove(222) println("删除元素222是否成功:${isDelete}") println(set) //批量删除,传递集合 set.removeAll(listOf(11, 4)) println(set) //批量删除,传递数组 set.removeAll(arrayOf(2, 111)) println(set) } ~~~ 运行结果 ``` [1, 2, 3, 4] 添加元素成功:true [1, 2, 3, 11, 4, 22] [1, 2, 3, 4, 22, 11, 222, 111] 删除元素222是否成功:true [1, 2, 3, 4, 22, 11, 111] [1, 2, 3, 22, 111] [1, 3, 22] Process finished with exit code 0 ``` #### 修改元素:不支持 set集合没有位置的概念,所以,无法确定某一个位置的元素到底是什么,所以无法进行修改。参考截图: ![](http://upload-images.jianshu.io/upload_images/7368752-15f08b6131b94112.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) #### 查询元素:elementAt、elementAtOrNull set集合根据索引位置获取元素,不是通过get方法,通过elementAt方法和elementAtOrNull方法。 ![](http://upload-images.jianshu.io/upload_images/7368752-00c79fba104bf5b6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我们通过一个案例,演示下两个api,参考代码: ~~~ fun main(args: Array<String>) { val set = mutableSetOf(1, 2, 3, 4, 1)//不重复,有序 var element: Int? = set.elementAt(1) println("第2个位置的元素是:${element}") element = set.elementAtOrNull(3) println("第4个位置的元素是:${element}") element = set.elementAtOrNull(14) println("第15个位置的元素是:${element}") } ~~~ 运算结果 ``` 第2个位置的元素是:2 第4个位置的元素是:4 第15个位置的元素是:null Process finished with exit code 0 ``` #### 是否包含元素:contains方法、containsAll方法 contains方法用于判断集合中是否存包含某个元素,方法接收参数为元素,返回值Boolean类型,方法定义如下: ~~~ public operator fun contains(element: @UnsafeVariance E): Boolean ~~~ contains方法用于判断集合中是否存包含多个元素,方法接收一个集合,返回值Boolean类型,方法定义如下: ~~~ public fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean ~~~ 我们通过一个案例,来看看集合元素是否包含操作,参考代码: ~~~ fun main(args: Array<String>) { val set = mutableSetOf(1, 2, 3, 4, 1)//不重复,有序 println("set集合的长度是:${set.size}") println("set集合的长度是:${set.count()}") var index = set.indexOf(1) println("元素1的正向索引是:${index}") index = set.indexOf(11) println("元素11的正向索引是:${index}") index = set.lastIndexOf(4) println("元素4的反向索引是:${index}") var element: Int? = set.elementAt(1) println("第2个位置的元素是:${element}") element = set.elementAtOrNull(3) println("第4个位置的元素是:${element}") element = set.elementAtOrNull(14) println("第15个位置的元素是:${element}") //是否包含元素 var isContains = set.contains(3) println("是否包含元素3:${isContains}") //是否包含集合 isContains = set.containsAll(listOf(1, 2, 3)) println("是否包含集合[1,2,3]:${isContains}") isContains = set.containsAll(listOf(11, 22, 3)) println("是否包含集合[11,22,3]:${isContains}") } ~~~ 运算结果 ``` set集合的长度是:4 set集合的长度是:4 元素1的正向索引是:0 元素11的正向索引是:-1 元素4的反向索引是:3 第2个位置的元素是:2 第4个位置的元素是:4 第15个位置的元素是:null 是否包含元素3:true 是否包含集合[1,2,3]:true 是否包含集合[11,22,3]:false Process finished with exit code 0 ``` #### 获取元素索引:indexOf方法 set集合可以通过indexOf、lastIndexOf获取索引。 indexOf()获取元素对应的位置,从集合开始位置开始查找,找到返回索引,没有找到返回-1。方法签名如下: ```java public fun indexOf(element: @UnsafeVarianceE): Int ``` lastIndexOf获取元素对应的位置,从集合结束位置开始查找,找到返回索引,没有找到返回-1。方法签名如下: ```java publicfun lastIndexOf(element: @UnsafeVariance E): Int ``` 我们通过一个案例,来看看集合的是否包含,参考代码: ~~~ fun main(args: Array<String>) { val set = mutableSetOf(1, 2, 3, 4, 1)//不重复,有序 var index = set.indexOf(1) println("元素1的正向索引是:${index}") index = set.indexOf(11) println("元素11的正向索引是:${index}") index = set.lastIndexOf(4) println("元素4的反向索引是:${index}") } ~~~ 运算结果 ``` 元素1的正向索引是:0 元素11的正向索引是:-1 元素4的反向索引是:3 Process finished with exit code 0 ``` #### 获取数组长度:size属性、count方法 同数组,同list集合,获取长度可以通过size属性和count方法去获取,参考代码: ~~~ fun main(args: Array<String>) { val set = mutableSetOf(1, 2, 3, 4, 1)//不重复,有序 println("set集合的长度是:${set.size}") println("set集合的长度是:${set.count()}") } ~~~ 运算结果 ``` set集合的长度是:4 set集合的长度是:4 Process finished with exit code 0 ```