我正在尝试使用Kotlin以更实用的方式迭代嵌套的Hashmap。特别是,我有两个HashMap实例(类型Map<String, Integer>
),我想根据一些标准匹配它们的值。这是我想要实现的Java方法:
Map<Integer, Integer> pairs = new LinkedHashMap<>();
for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) {
for (Map.Entry<String, Integer> newImages : finalImageMap.entrySet()) {
Integer oldImageVal = oldImages.getValue();
Integer newImageVal = newImages.getValue();
boolean containsNewType = pairs.containsKey(newImageVal) &&
pairs.get(newImageVal).intValue() == oldImageVal.intValue();
boolean urlsMatch = newImages.getKey().equals(oldImages.getKey());
if (!containsNewType && urlsMatch) {
pairs.put(oldImageVal, newImageVal);
}
}
}
return pairs;
这是我在Kotlin中尝试功能等同的尝试:
private val swapPairs: Map<Int, Int>
get() {
val pairs = LinkedHashMap<Int, Int>()
startingImageMap.forEach {
val finalImageMap = finalImageMap.filterValues {
val containsNewType = pairs.containsKey(it) && pairs[it] == startingImageMap[it]
val urlMatch = it == startingImageMap[it]
return !containsNewType && urlsMatch
}.values.first()
}
return pairs
}
我坚持使用filterValues
如何正确执行此操作。
Kotlin中的正确解决方案是什么样的?
答案 0 :(得分:0)
这里的问题是这是一个有状态的过滤器,这意味着将元素放入最终结果的决定取决于之前处理的元素。功能过滤器应该是无状态的,因此无论元素的处理顺序如何,添加元素的决定都是相同的。
但是,我认为整个逻辑有点冗长。
您可以像这样重写Java版本:
Map<Integer, Integer> pairs = new LinkedHashMap<>();
for (Map.Entry<String, Integer> oldImages : startingImageMap.entrySet()) {
Integer oldImageVal = oldImages.getValue();
Integer newImageVal = finalImageMap.get(oldImages.getKey());
if (newImageVal != null) {
boolean containsNewType = pairs.containsKey(newImageVal) &&
pairs.get(newImageVal).intValue() == oldImageVal.intValue();
if (!containsNewType) {
pairs.put(oldImageVal, newImageVal);
}
}
}
return pairs;
哪个更短,做同样的事情。
但由于使用pairs
检查了外部地图containsKey
,因此仍然是有状态的。
我想知道在这种情况下函数的预期输出是什么:
old new
A: 1 A: 5
B: 2 B: 2
C: 3 C: 3
D: 4 E: 8
H: 9 F: 9
G: 3
你能加上预期的结果吗?我觉得这个功能有缺陷。