首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么mutableSet不更新!!对于Kotlin格式的列表中的项目

mutableSet不更新的原因是因为Kotlin中的Set是基于哈希表实现的,它使用元素的哈希值来确定元素在集合中的位置。当我们向Set中添加一个元素时,它会根据元素的哈希值计算出一个桶的索引,并将元素放入该桶中。

当我们修改Set中的元素时,它的哈希值可能会发生变化。如果我们直接修改元素的属性,而不更新Set中的元素,那么元素的哈希值就会保持不变,导致元素在Set中的位置不正确。这会导致Set无法正确地定位和更新元素。

为了解决这个问题,我们需要先从Set中删除要修改的元素,然后再将修改后的元素添加回Set中。这样,元素的哈希值会重新计算,并且元素会被正确地放置在Set中的新位置。

以下是一个示例代码,展示了如何正确地更新mutableSet中的元素:

代码语言:txt
复制
data class Person(val name: String, var age: Int)

fun main() {
    val people = mutableSetOf(
        Person("Alice", 25),
        Person("Bob", 30),
        Person("Charlie", 35)
    )

    val personToUpdate = people.find { it.name == "Bob" }
    personToUpdate?.age = 31

    people.remove(personToUpdate)
    people.add(personToUpdate)

    println(people)
}

在上面的示例中,我们首先找到要更新的元素"Bob",然后修改了他的年龄。接下来,我们从Set中删除了这个元素,并将修改后的元素重新添加回Set中。最后,我们打印了更新后的Set。

需要注意的是,如果我们修改了元素的属性,并且该属性参与了元素的哈希值计算,那么我们在修改属性后,还需要重新计算元素的哈希值。可以通过重写元素的hashCode()方法来实现。

总结起来,mutableSet不会自动更新的原因是基于哈希表实现的Set在元素修改后无法正确定位和更新元素。我们需要手动从Set中删除旧元素,并将修改后的元素重新添加回Set中,以确保Set中的元素是最新的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin实战【六】Kotlin中集合创建

kotlin集合 Kotlin集合分为两派:可变集合与不可变集合 ?...列表:List/MutableList; 集:Set/MutableSet; 映射:Map/MutableMap; 集:Collection/MutableCollection; 迭代器:Iterable...,而是一个普通函数 kotlin集合与Java中集合关系 接下来让我们看一下创建对象类型: println(list.javaClass) //class java.util.Arrays$ArrayList...为什么Kotlin没有自己专门集合类呢? 答: 因为使用标准java集合类可以更好和java交互。kotlin与java互调不用考虑集合类转换。...尽管如此Kotlin并没有止步,而是在此基础上增加了很多方法,如: 获取列表最后一个元素,或者得到一个数字列表最大值: val strings = listOf("first",

1K20

第7章 集合类第7章 集合类

Kotlin集合类分为:可变集合类(Mutable)与不可变集合类(Immutable)。 7.1.1 常用3种集合类 集合类主要有3种:List(列表)、Set(集)和 Map(映射)。...集合类分类 List 列表 List 列表主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾。列表在数据结构可表现为:数组和向量、链表、堆栈、队列等。...Set 集 Set 集是最简单一种集合,它对象按特定方式排序,只是简单把对象加入集合,就像往口袋里放一堆溜溜弹珠。 Set 集中没有重复对象。...7.1.2 Kotlin 集合类继承层次 下面是 Kotlin 集合接口类图 ? Kotlin 集合类继承层次 其中各个接口说明如下表所示 接口 功能 Iterable 父类。...() 、mutableMapOf() 来创建可变 MutableList 列表MutableSet 集、MutableMap 映射表。

1.2K20

Kotlin极简教程(1)数据类型

因为种种原因,谷歌把Android第一开发语言改成了Kotlin。虽然近来用Java编写Android是是非常便利。...但是经过多次更新后,Java在Android方面的用处肯定会比不上Kotlin,所以有必要学习一下Kotlin。...不需要分号结尾,声明变量时数据可以省略数据类型 注:用val关键词声明变量类似于Java中用final修饰了,声明时必须初始化 2、简单变量之间转换 toInt()、toLong...it关键字调用set元素 } 注: //只有MutableSet有add()和remove()方法 //添加元素 set.add("zack") //删除元素,因为Set是无序,所以不能通过下标删除元素...) var humanList:MutableList = mutableListOf() //此时it.age含义就是:将humanList的人,按照年龄来升序排 humanList.sortBy

1.1K20

Kotlin】集合操作总结 ( List 集合 | MutableList 集合 | List 集合遍历 | Set 集合 | MutableSet 集合 | Map 集合 | 可变 Map集合 )

集合分为两类 , 只读集合 和 可变集合 ; 调用 listOf 函数 , 可以 直接创建 List 集合 ; 通过 [] 下标可以 直接获取 List 集合元素 ; fun main()...可以重复 , Set 集合元素 不可重复 ; 调用 setOf 函数 , 可以创建 Set 集合 ; 调用 Set#elementAt 函数 , 可以 读取 Set 集合元素 ; 代码示例...= mutableSetOf("Tom", "Jerry", "Jack") mutableSet += "Bill" mutableSet -= "Jerry" println...(mutableSet) println(mutableSet.elementAt(2)) } 执行结果 : [Tom, Jack, Bill] Bill 十、List 与 Set 之间相互转换...* 这对于创建噪音更少[Map]字面量很有用,例如: * @sample samples.collections.Maps.Instantiation.mapFromPairs */ public

4.9K20

Kotlin学习日志(二)数据类型

:变量类型”格式声明,不同于Java中常见“变量类型:变量名”这种格式,(PS:这个在刚开始接触Kotlin时候很容易搞混,用久了就可以了),后面是没有分号,Java则有,在Kotlin如果你后面还有其他语句的话则要加上分号...,接下来就是操作这个数组了, 2.1数组元素操作 对于数组操作,常见处理包括获取数组长度、获取指定位置数组元素,这些操作在Kotlin与Java是有区别的,如下: (1)获取数组长度,Java...字符串变量toCharArray方法 字符串变量toCharArray方法 可以看到Kotlin对于Java转换要简单一些,通过方法即可实现。...现在常用方法都介绍完毕了,(PS:讲真的,挺繁琐) 3.2字符串模板及拼接 Kotlin格式化字符串, ? ?...因为Set是只读集合,初始化赋值后便不可更改,所以元素变更方法只适用于可变集合MutableSet,但MutableSet变更操作尚有以下限制 (1)MutableSetadd方法仅仅在集合添加元素

3.3K20

Kotlin入门(16)容器遍历方式

Kotlin号称全面兼容Java,于是乎Java容器类仍可在Kotlin中正常使用,包括大家熟悉队列ArrayList、映射HashMap等等。...不过Kotlin作为一门全新语言,肯定还是要有自己容器类,不然哪天Java跟Kotlin划清界限,那麻烦就大了。...,如果存在则覆盖之; 因为Set是只读集合,初始化赋值后便不可更改,所以元素变更方法只适用于可变集合MutableSet,但MutableSet变更操作尚有以下限制: 1、MutableSet...add方法仅仅往集合添加元素,由于集合是无序,因此不知道添加具体位置; 2、MutableSet没有修改元素值方法,一个元素一旦被添加,就不可被修改; 3、MutableSetremove...方法用于删除指定对象,但无法删除某个位置元素,这是因为集合内元素不是按顺序排列对于集合遍历操作,Kotlin提供了好几种方式,有熟悉for循环,有迭代器循环,还有新面孔forEach循环,

2.3K20

使用注解自动生成代码

module 自定义注解处理器 module 为什么需要分开两个工程?..., for kotlin (如果使用注解代码是 Kotlin 代码,必须加上这个,否则注解处理器生效) annotationProcessor project(':car-processor') /...Java/Kotlin 代码库 在上面的例子,我们需要扫描出所有标注了 @CarAnnotation 注解类,然后自动生成一个 CarFactory 类 1.首先找到所有标注了注解代码 //...方法,所以: 如果代码根本没有使用到注解,process 方法是执行 如果使用注解代码是 Kotlin 代码,那么必须使用 kapt {your_porcessor_module} 方式依赖...执行 3.process() 方法会执行多次,如何保证写文件逻辑不被多次调用 可以在 process() 方法通过调用 val processingOver = roundEnvironment.processingOver

82800

Kotlin 编码规约

源代码组织 目录结构 在混合语言项目中,Kotlin 源文件应当与 Java 源文件位于同一源文件根目录下,并遵循相同目录结构(每个文件应存储在与其 package 语句对应目录 )。...在纯 Kotlin 项目中,推荐目录结构遵循省略了公共根包包结构(例如,如果项目所有代码都位于“org.example.kotlin”包及其子包,那么“org.example.kotlin”包文件应该直接放在源代码根目录下...源文件组织 鼓励多个声明(类、顶级函数或者属性)放在同一个 Kotlin 源文件,只要这些声明在语义上彼此紧密关联并且文件保持合理大小(超过几百行)。...格式化 在大多数情况下,Kotlin 遵循 Java 编码规范。 使用 4 个空格缩进。不要使用 tab。 对于花括号,将左花括号放在结构起始处行尾,而将右花括号放在与左括结构横向对齐单独一行。...fun f(x: String) = x.length 属性格式对于非常简单只读属性,请考虑单行格式: val isEmpty: Boolean get() = size == 0 对于更复杂属性

3K22

编译时注解apt kapt

--《Kotlin in Action》 注解(也被成为元数据)为我们在代码添加信息提供了一种形式化方法,使我们可以在稍后某个时刻非常方便地使用这些数据。...--《Thinging in Java》 在Java和Kotlin声明注解方式还是有些差异: Java: public @interface MyAnnotation { } public @interface...而这些生成Java文件,会同时与其他普通手写Java源代码一起被javac编译。 KAPT与APT完全相同,只是在Kotlin注解处理器。...一、声明注解 在项目中新建一个java library,声明两个注解,一个用来注解类,一个用来注解方法。...,其中有一个静态方法bindview,传入参数是activity,方法是我们注解text123和text2findviewById。

1.7K20

Kotlin Collection VS Kotlin Sequence VS Java Stream

集合函数式 API 虽然 Kotlin Collection 函数式 API 类似于 Java 8 Stream API。但是 Kotlin 集合跟 Java 集合并不一致。...可变集合是 MutableList、MutableSet、MutableMap,它们是支持读写类型,能够对集合进行修改操作。...Kotlin 集合函数式 API 跟大部分支持 Lambda 语言函数式 API 都类似。下面仅以 filter、map、flatMap 三个函数为例,演示使用集合高阶函数。...:println) 执行结果: JAVA KOTLIN SCALA GROOVY 1.3 flatMap 使用 遍历所有的元素,为每一个创建一个集合,最后把所有的集合放在一个集合。...性能 大多数终端操作符是 inline 函数 对于值可能不存在情况,Sequence 支持可为空类型,而 Stream 会创建 Optional包装器。因此会多一步对象创建。

63721

我承认 IDEA 2021.3 有点强!

配置不像以前那样明显易用 新版主要更新内容 Space 集成:(我公司团队不用这个,我自己一个人也用不到这个,忽略) 支持 Java 16 :(打扰了,日常用着 8 和 11,先体验吧) 更好...WSL 2 支持 UX 外部依赖项 Java 项目 WSL 2 支持 我们知道您一直在期待这次更新!现在,您可以在 IntelliJ IDEA 中使用 WSL 2 Java 项目。...HPROF 内存查看器 在 Windows 上快速访问最近项目 我们更新了对 Windows 跳转列表支持,现在,右键点击任务栏或开始菜单上 IntelliJ IDEA 图标即可打开您最近项目。...配置格式化程序。...Kotlin 调试器更新 IntelliJ IDEA 调试器可以评估 Kotlin get 表达式,并将其显示在 Variables 视图中。您也可以从 IDE 跳转到源。

3.6K20

我不得不承认 IDEA 2021.3 有点强!

配置不像以前那样明显易用 新版主要更新内容 Space 集成:(我公司团队不用这个,我自己一个人也用不到这个,忽略) 支持 Java 16 :(打扰了,日常用着 8 和 11,先体验吧)...WSL 2 支持 UX 外部依赖项 Java 项目 WSL 2 支持 我们知道您一直在期待这次更新!现在,您可以在 IntelliJ IDEA 中使用 WSL 2 Java 项目。...HPROF 内存查看器 在 Windows 上快速访问最近项目 我们更新了对 Windows 跳转列表支持,现在,右键点击任务栏或开始菜单上 IntelliJ IDEA 图标即可打开您最近项目。...配置格式化程序。...Kotlin 调试器更新 IntelliJ IDEA 调试器可以评估 Kotlin get 表达式,并将其显示在 Variables 视图中。您也可以从 IDE 跳转到源。

3.4K40

Effective Kotlin 译文:Chapter3-Item24-泛型型变

type_hierarchy.png] Kotlin 类型继承体系 这并不是巧合,正是因为在 Kotlin ,所有函数类型参数类型是逆变,而函数类型返回类型是协变...= 'B'; // 编译没有问题,但是运行时抛出 ArrayStoreException 在 Kotlin ,数组是型变,所以以上问题就不存在了。...Kotlin List,在 Kotlin , List 只提供了可读方法,因此 List 在声明处定义成了协变(使用 out) 对应,逆变类型参数如果放在公有的输出位置,也会存在问题...译者注: 在 Java 只有使用处型变 总结 Kotlin 有强大泛型类型,并且支持使用声明处型变以及使用处型变 默认类型参数是型变 out 修饰符可以使类型参数协变 in 修饰符可以使类型参数逆变...在 Kotlin List 和 Set 是协变,MutableList,MutableSet,MutableMap 是型变 函数类型参数类型是逆变,函数类型返回类型是协变 协变类型参数

71840

Effective Kotlin 译文:Chapter3-Item24-泛型型变

更多关于泛型内容可参见我另一篇文章:《一文了解 Java/Kotlin 泛型》 条目 24:关注泛型型变 名词解释表 英文 中文 解释 type parameter 类型参数 泛型尖括号参数...这并不是巧合,正是因为在 Kotlin ,所有函数类型参数类型是逆变,而函数类型返回类型是协变: 这并不是 Kotlin 唯一一个支持型变类型,还有一个更加常见支持协变类型就是 List...= 'B'; // 编译没有问题,但是运行时抛出 ArrayStoreException 在 Kotlin ,数组是型变,所以以上问题就不存在了。...译者注: 在 Java 只有使用处型变 总结 Kotlin 有强大泛型类型,并且支持使用声明处型变以及使用处型变 默认类型参数是型变 out 修饰符可以使类型参数协变 in 修饰符可以使类型参数逆变...在 Kotlin List 和 Set 是协变,MutableList,MutableSet,MutableMap 是型变 函数类型参数类型是逆变,函数类型返回类型是协变 协变类型参数

58210

Scala语言快速了解一下?

_,这里也能解释,为什么以scala开头包,在使用时都是省去scala.。如果想要引入包几个成员,可以使用selector(选取器):import java.awt....这种技巧在横跨了若干包大型项目中非常有用,它允许你定义一些在你项目的若干子包可见但对于项目外部客户却始终不可见东西。...Scala 方法声明格式如下:def functionName ([参数列表]) : [return type]如果你写等于号和方法主体,那么方法会被隐式声明为抽象(abstract),包含它类型于是也是一个抽象类型...Scala 方法定义格式如下:def functionName ([参数列表]) : [return type] = { function body return [expr]}以上代码 return...,包含除了第一元素之外其他元素isEmpty 在列表为空时返回true对于Scala列表任何操作都可以使用这三个基本操作来表达。

2.9K102

Android--利用APT+kotlinpoet实现组件化开发Router机制

利用注解解析器(APT)和代码生成器(kotlinpoet)可以根据注解在编译期间就生成相应代码,业界称之为Router机制 一、Gradle配置及架构分层 在实现Router机制之前,我们还可以对项目的组织架构进行优化...group-RouterMeta列表Map 对group-RouterMeta列表Map进行处理,首先遍历RouterMeta列表,使用kotlinpoet生成IRouterPath实现类,再根据...by lazy { mElementUtils.getTypeElement(Const.ISERVICE).asType() } // 组名:RouterMeta列表Map private...routerMetaByGroup: MutableMap> by lazy { mutableMapOf() } // 组名:文件名列表...一个moudle可以有多个group 最后附上一张结构图: 项目地址:https://gitee.com/aruba/arouter-application.git

88320

Kotlin 极简教程 》第5章 集合类(1)

5.1 集合类是什么 5.1.2 集合类是一种数据结构 在讲 Kotlin 集合类之前,为了更加深刻理解为什么要有集合类,以及集合类到底是怎么一回事,让我们先来简单回顾一下编程本质: 数据结构 +...(1)列表 列表主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序集是不同列表在数据结构可表现为:数组和向量、链表、堆栈、队列等。...(2)集 集(set)是最简单一种集合,它对象按特定方式排序,只是简单把对象加入集合,就像往口袋里放东西。 对集中成员访问和操作是通过集中对象引用进行,所以集中不能有重复对象。...除了继承List那些函数外,另外新增了add/addAll、remove/removeAll/removeAt、set、clear、retainAll等更新修改操作函数。...Set也分为:不可变Set和支持增加和删除可变MutableSet

2.7K20

Android开发4年,面试居然只值10K,4年Crud终于悔恨顿悟!

Jetpack 实际项目中用过哪儿些? 简述 Apk 包大小优化思路。 Kotlin 拓展函数怎么实现?基于什么原理。 Kotlin 属性委托怎么实现?基于什么原理。...直播是什么实现?需要注意有什么?使用过视频格式有什么?如何保证视频以及文字/语音同步性? 开发过音频相关吗?用是什么?音频格式是什么? 微信小程序使用什么开发?Vue 还是?...公司是否有自营项目?外包吗? 为什么 Google Play 搜索不到,原因是什么?怎么处理?现在是一个什么样状态? 关于弹框隐私协议,工信部怎么规定?...假设后端接口列表返回了超大图片,你是如何处理优化并正常显示列表? 使用过 Jetpack 哪儿些东西,你对它评价怎么说? Jetpack Compose 了解过么?简单谈下个人理解。...Android学习路线图 首先,对于没有学习方向,知识体系的人,我把我工作几年整理学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个去学习,知识体系的人可以参考下我整理路线方式

47400
领券