作者:我只记得她 | 来源:互联网 | 2022-11-21 17:34
1> Lino says Re..:
您可以通过辅助函数中的一些简单递归逻辑来实现:
public static String findCorrespondingValue(Map map, String key){
if(map.containsKey(key)){
return findCorrespondingValue(map, map.get(key));
}
return key;
}
如上所述逻辑非常简单,我们只检查给定key
的值是否存在给定的值map
如果是,那么我们再次执行该功能,但这次使用value
新的功能key
.
如果不存在映射,我们可以有把握地说,key
给定的是链中的最后一个值
您可以像这样调用方法:
Map testMap = ... // setup testMap
Map result = new HashMap<>();
for (final Entry entry : testMap.entrySet()) {
result.put(
entry.getKey(),
findCorrespondingValue(testMap, entry.getValue())
);
}
或者如果你碰巧使用java 8:
Map result = testMap.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey(), // or just Map.Entry::getKey
e -> findCorrespondingValue(e.getValue())
));
你当然必须实现某种逻辑来确定你是否有循环引用.例如:
a -> b
b -> f
f -> a
哪个目前只是失败了StackOverflowError
.
如果你想支持多种不同的类型,你可以使它也是通用的,而不只是String
:
public static T findCorrespondingValue(Map extends T, ? extends T> map, T key){
if(map.containsKey(key)){
return findCorrespondingValue(map, map.get(key));
}
return key;
}