我正在尝试从列表中构建地图。我的目标是比较两个列表并发现这两个列表之间的差异。然后,我想构建一个地图,以便知道我在哪个索引中发现了差异。我是用 Java 做的,我相信不是很好,但它确实有效。//I compare the two values for a given index, if value are the same, I set null in my result listList<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 indexMap<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,不是很熟悉)。谢谢您的帮助。
1 回答
鸿蒙传说
TA贡献1865条经验 获得超7个赞
您可以zip在集合中使用函数来连接两个元素。该withIndex()函数有助于将列表转换为元素索引和值对的列表。完整的解决方案可能如下
val list1 = listOf("a", "b", "c")
val list2 = listOf("a", "B", "c")
val diff : Map<Int, String> = list1.withIndex()
.zip(list2) { (idx,a), b -> if (a != b) idx to "$a != $b" else null}
.filterNotNull().toMap()
请注意,zip当两个列表中都有元素时,该函数会进行迭代,它将跳过任何列表中可能存在的剩余部分。可以通过使用以下函数添加空元素来修复它:
fun <T> List<T>.addNulls(element: T, toSize: Int) : List<T> {
val elementsToAdd = (toSize - size)
return if (elementsToAdd > 0) {
this + List(elementsToAdd) { element }
} else {
this
}
}
并在使用该函数之前在两个列表上调用该zip函数
添加回答
举报
0/150
提交
取消