Kotlin 基础——Set集合详解

本文详细介绍了Kotlin中的Set集合,包括声明、创建、使用方法及遍历方式。着重讨论了可变Set的操作,如添加、删除元素,并通过实例展示了相关操作的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Kotlin的集合类由两个接口派生:Collection和Map。

Kotlin的集合分为两大类:可变集合和不可变集合。只有可变集合才能添加、删除、修改元素,不可变集合只能读取元素。

Kotlin的Collection集合和Set集合的功能基本相同,Set集合只是为Collection集合增加了额外的限制:集合元素不允许重复

一、声明和创建

Kotlin提供了如下函数来创建Set集合。

  • setOf():该函数返回不可变的Set集合。该函数可以接受0个或多个参数,这些参数将作为集合的元素。
  • mutableSetOf():该函数返回可变的MutableSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
  • hashSetOf():该函数返回可变的HashSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
  • linkedSetOf():该函数返回可变的LinkedHashSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
  • sortedSetOf():该函数返回可变的TreeSet集合。该函数可接受0个或多个参数,这些参数将作为集合的元素。
    //创建不可变集合,返回值是Set
    var set = setOf("Java", "Kotlin", "Go")
    println(set)//集合元素按添加顺序排列
    //创建可变集合,返回值是MutableSet
    var mutableSet = mutableSetOf("Java", "Kotlin", "Go")
    println(mutableSet)//集合元素按添加顺序排列
    println("setOf返回对象的实际类型:${set.javaClass}")
    println("mutableSetOf返回对象的实际类型:${mutableSet.javaClass}")
    //创建HashSet集合
    var hashSet = hashSetOf("Java", "Kotlin", "Go")
    println(hashSet)//不保证元素的顺序
    //创建LinkedHashSet集合
    var linkedHashSet = linkedSetOf("Java", "Kotlin", "Go")
    println(linkedHashSet)//集合元素按添加顺序排列
    //创建TreeSet集合
    var treeSet = sortedSetOf("Java", "Kotlin", "Go")
    println(treeSet)//集合元素由小到大排列

输出结果:

[Java, Kotlin, Go]
[Java, Kotlin, Go]
setOf返回对象的实际类型:class java.util.LinkedHashSet
mutableSetOf返回对象的实际类型:class java.util.LinkedHashSet
[Go, Java, Kotlin]
[Java, Kotlin, Go]
[Go, Java, Kotlin]

二、使用Set的方法

    //创建不可变集合,返回值是Set
    var set = setOf("Java", "Kotlin", "Go")
    //判断是否所有元素的长度都大于4
    println(set.all { it.length > 4 })
    //判断是否任一元素的长豆都大于4
    println(set.any { it.length > 4 })
    //以Lambda表达式的值为key,集合元素为value,组成Map集合
    val map = set.associateBy { "学习" + it + "语言" }
    println(map)

    println("Java" in set)
    println("Go" !in set)

    //返回删除Set集合前面两个元素后的集合
    val dropedList = set.drop(2)
    println(dropedList)

    //对Set集合元素进行过滤:要求集合元素包含li
    val fliteredList = set.filter { "li" in it }
    println(fliteredList)

    //查找Set集合中包含li的元素,如果找到就返回该元素,否则就返回null
    val foundStr1 = set.find { "li" in it }
    println(foundStr1)

    //查找Set集合中的所有字符串拼接在一起
    val foldedList = set.fold("", { acc, e -> acc + e })
    println(foldedList)

    //查找某个元素的出现位置
    println(set.indexOf("Go"))

    //将每个集合元素映射成新值,返回所有新值组成的Set集合
    val mappedList = set.map { "学习" + it + "编程" }
    println(mappedList)

    //获取最大值
    println(set.max())

    //获取最小值
    println(set.min())

    //反转集合顺序
    val reversedList = set.reversed()
    println(reversedList)

    val bSet = setOf("Lua", "Erlang", "Kotlin")
    //计算两个集合的交集
    println(set intersect bSet)
    //计算两个集合的并集
    println(set union bSet)
    //集合相加,相当于并集
    println(set + bSet)
    //集合相减,减去公共的元素
    println(set - bSet)

输出结果:

false
true
{学习Java语言=Java, 学习Kotlin语言=Kotlin, 学习Go语言=Go}
true
false
[Go]
[Kotlin]
Kotlin
JavaKotlinGo
2
[学习Java编程, 学习Kotlin编程, 学习Go编程]
Kotlin
Go
[Go, Kotlin, Java]
[Kotlin]
[Java, Kotlin, Go, Lua, Erlang]
[Java, Kotlin, Go, Lua, Erlang]
[Java, Go]

Kotlin规定以infix修饰的方法,能以运算符的方式进行调用。

三、遍历Set

Kotlin也支持使用for-in循环遍历Set,与遍历数组的方式基本相同。

    var languages = setOf("Java", "Kotlin", "Python")
    for (language in languages) {
        println(language)
    }

输出结果:

Java
Kotlin
Python

Set集合可使用接口中定义的forEach()方法来遍历集合。

    var languages = setOf("Java", "Kotlin", "Python")
    languages.forEach { println(it) }

输出结果:

Java
Kotlin
Python

由于setOf()方法返回的Set集合是有序的,所以可以通过索引来遍历Set集合,Set集合提供了indices方法返回其索引的区间。

    var languages = setOf("Java", "Kotlin", "Python")
    for (i in languages.indices) {
        println(languages.elementAt(i))
    }

输出结果:

Java
Kotlin
Python

四、可变的Set

setOf()函数返回的额集合是不可变集合;使用mutableSetof()、hashSetOf()、linkedSetOf()、sortedSetOf()函数返回的集合都是可变的。

4.1、添加元素

Set提供了add(element:E)方法来添加元素,每调用该方法一次,就会向Set中添加一个元素,Set的长度也会自动加1.

提供了addAll(elements:Collection)方法来批量添加多个元素。

    //定义一个可变的Set
    var languages = mutableSetOf("Java")
    //添加一个元素
    languages.add("Go")
    languages.add("Lua")
    println(languages)
    println(languages.count())
    languages.addAll(setOf("Swift", "Kotlin"))
    println(languages)

输出结果:

[Java, Go, Lua]
3
[Java, Go, Lua, Swift, Kotlin]

4.2、删除元素

Set提供了如下方法来删除元素:

  • remove(element:E):删除指定元素,删除成功则返回true。
  • removeAll(elements:Collection):批量删除Set集合中的多个元素。
  • retainAll(elements:Collection):只保留Set集合中与elements集合共有的元素。
  • clear():清空集合。
    //定义一个可变的Set
    var languages = mutableSetOf("Java", "OC", "PHP", "Perl", "Ruby", "Go")
    //删除"PHP"
    languages.remove("PHP")
    //再次删除"Perl"
    languages.remove("Perl")
    println(languages)
    //批量删除多个元素
    languages.removeAll(setOf("Ruby", "Go"))
    println(languages)
    //清空Set集合
    languages.clear()
    println(languages.count())

输出结果:

[Java, OC, Ruby, Go]
[Java, OC]
0

Kotlin的MutableIterator才相当于Java的Iterator。

更多精彩内容请扫码关注:
在这里插入图片描述

### KotlinSet集合的使用方法和特性 #### 1. 基本概念 Kotlin中的`Set`是一种不可重复的数据结构,它不允许存储相同的元素。如果尝试向`Set`中添加已存在的元素,则操作会失败,而原集合保持不变。 #### 2. 不可变Set集合 Kotlin提供了不可变的`Set`集合,可以通过`setOf()`函数创建。这种集合一旦创建就不能修改其内容。 ```kotlin val immutableSet = setOf("Alice", "Bob", "Charlie") println(immutableSet.size) // 输出3 [^1] ``` #### 3. 可变Set集合 对于需要动态增删元素的情况,可以使用可变的`MutableSet`集合。通过`mutableSetOf()`函数创建后,支持添加(`add`)、删除(`remove`)等操作。 ```kotlin val mutableSet: MutableSet<String> = mutableSetOf("lisi", "wangwu") mutableSet += "zhangsan" mutableSet.add("zhaoliu") mutableSet -= "zhangsan" mutableSet.remove("zhaoliu") println(mutableSet) // 输出 [lisi, wangwu] ``` #### 4. 添加与移除元素 - **添加单个元素**: 使用`add(element)`方法来添加新元素。 - **批量添加**: 使用`addAll(elements)`方法一次性添加多个元素。 - **移除单个元素**: 使用`remove(element)`方法移除指定元素。 - **条件移除**: `removeIf(predicate)`可以根据给定条件批量移除符合条件的元素。 ```kotlin val set = mutableSetOf("张三", "大漂亮", "王美丽", "王五", "大漂亮") set.add("tiger") // 添加单一元素 set.addAll(listOf("lion", "elephant")) // 批量添加 set.remove("王五") // 移除特定元素 set.removeIf { it.contains("王") } // 条件移除 println(set) // 输出可能为 [张三, 大漂亮, tiger, lion, elephant] [^3] ``` #### 5. 集合去重功能 由于`Set`本身具有自动去重的功能,在处理数据时无需额外编写逻辑即可实现去重效果。 ```kotlin val names = listOf("张三", "李四", "张三", "王五") val uniqueNames = names.toSet() println(uniqueNames) // 输出 [张三, 李四, 王五] [^1] ``` #### 6. Set与其他集合的关系 虽然`Set`和`List`都属于集合类型,但它们的行为不同。`Set`强调唯一性和无序性,而`List`则允许重复并保留顺序。此外,还有`Map<K,V>`类型的键值对集合,它的声明方式也有所不同[^2]。 #### 7. 对象比较 在涉及`Set`的操作时,需要注意对象之间的比较规则。Kotlin中默认采用值比较 (`==`) 而不是引用比较 (`===`)。 ```kotlin data class Person(val name: String) fun main() { val person1 = Person("Alice") val person2 = Person("Alice") val set = mutableSetOf(person1) println(set.contains(person2)) // 输出 false (因为是不同的实例) } ``` 要使上述例子返回true,需确保两个对象的内容相等,通常可通过覆盖`equals()`和`hashCode()`方法解决此问题[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值