如何使用 Kotlin 将列表转换为地图

我正在尝试从列表中构建地图。我的目标是比较两个列表并发现这两个列表之间的差异。然后,我想构建一个地图,以便知道我在哪个索引中发现了差异。


我是用 Java 做的,我相信不是很好,但它确实有效。


//I compare the two values for a given index, if value are the same, I set null in my result list

List<String> result = IntStream.range(0, list1.size()).boxed()

                .map(i -> list1.get(i) != list2.get(i) ? (list1.get(i)  + " != "+ list2.get(i)) : null)

                .collect(Collectors.toList());


//I filter all the null values, in order to retrieve only the differences with their index

Map<Integer, String> mapResult =

            IntStream.range(0, result.size())

            .boxed().filter(i-> null != result.get(i))

            .collect(Collectors.toMap(i -> i,result::get));

这不是最佳的,但它正在工作。如果您对这些代码行有任何建议,我很乐意接受。


我在 Kotlin 中尝试了两次复制这种行为,但我没有成功使用 map() 构造函数。(我还在学习Kotlin,不是很熟悉)。


谢谢您的帮助。


慕少森
浏览 109回答 1
1回答

鸿蒙传说

您可以zip在集合中使用函数来连接两个元素。该withIndex()函数有助于将列表转换为元素索引和值对的列表。完整的解决方案可能如下&nbsp; &nbsp; val list1 = listOf("a", "b", "c")&nbsp; &nbsp; val list2 = listOf("a", "B", "c")&nbsp; &nbsp; val diff : Map<Int, String> = list1.withIndex()&nbsp; &nbsp; &nbsp; &nbsp; .zip(list2) { (idx,a), b -> if (a != b) idx to "$a != $b" else null}&nbsp; &nbsp; &nbsp; &nbsp; .filterNotNull().toMap()请注意,zip当两个列表中都有元素时,该函数会进行迭代,它将跳过任何列表中可能存在的剩余部分。可以通过使用以下函数添加空元素来修复它:fun <T> List<T>.addNulls(element: T, toSize: Int) : List<T> {&nbsp; &nbsp; val elementsToAdd = (toSize - size)&nbsp; &nbsp; return if (elementsToAdd > 0) {&nbsp; &nbsp; &nbsp; &nbsp; this + List(elementsToAdd) { element }&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; this&nbsp; &nbsp; }}并在使用该函数之前在两个列表上调用该zip函数
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java