gpt4 book ai didi

java - Kotlin/Java 在 map 中收集 map 的功能和不可变方式

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:03:31 25 4
gpt4 key购买 nike

目前我正在通过 Java API 读取文件并通过 foreach 方法将项目添加到 map ,这迫使我使用可变 map 。有没有办法在没有可变映射的情况下收集项目?我知道有一个方法 collect 但我无法让它工作。

当前方式:

    val result = mutableMapOf<Int, MutableMap<Int, Double>>()
Files.lines(Paths.get(folderPath))
.map { line -> line.split(",") }
.map { items -> Triple(items[0].toInt(), items[1].toInt(), items[2].toDouble()) }
.forEach { (id, article, rating) ->
if (result.containsKey(id))
result[id]!!.put(article, rating)
else
result.put(id, mutableMapOf(Pair(article, rating)))
}

编辑:

我的目标是根据三元组的第一个值合并三元组对象。因此,一个场景是两个三重对象(1、2、5.5)和(1,3、5.5)。三元组的第一个值是用户 ID,第二个是文章 ID,第三个是文章的评分。合并后,映射中将有一个条目包含第一个键 = 用户 ID,三元组的第一个值,该值将是包含用户评分的文章的映射。

它目前正在按照我希望的方式工作,但我很好奇是否有更实用的方法来解决这个问题。

最佳答案

你可以这样做:

val result: Map<Int, Map<Int, Double>> = Files.lines(Paths.get(folderPath))
.map { it.split(",") }
.collect(groupingBy({ it[0].toInt() },
toMap<List<String>, Int, Double>({ it[1].toInt() }) { it[2].toDouble() }))

编译器似乎无法推断出 toMap 的类型, 所以我在那里添加了一个类型提示。

我要指出的是 Kotlin 没有不可变的 Map执行。 mapOf 返回的默认值是java.util.LinkedhashMap 可变的。只是Map接口(interface)不公开变异方法(如 putputAll )。你可以自由分配 MutableMap<Int, MutableMap<Int, Double>>Map<Int, Map<Int, Double>> ,这也是我在这里使用 result 上的类型注释所做的, 我强制静态类型是不可变的 Map .

关于java - Kotlin/Java 在 map 中收集 map 的功能和不可变方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44220996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com