java – 使用泛型递归合并Maps
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用泛型递归合并Maps,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3460字,纯文字阅读大概需要5分钟。
内容图文
![java – 使用泛型递归合并Maps](/upload/InfoBanner/zyjiaocheng/785/c3123c543e874b08b9e01e87a7f1ae0d.jpg)
我正在尝试构建一个合并两个地图内容的方法.我在这里看了一会儿,看不出这种通用的方法.如果可能的话,我想避免使用@SuppressWarnings(“未选中”)注释.我有一个嵌套的地图结构,其中键是字符串,值是更多东西的映射,此结构中的“叶子”节点始终是集合.因此,在大多数情况下,我有两个结构,如:
Map<String,Map<String,Set<String>>>
并且我想合并两个地图,以便最终得到两者的联合,并且这两个地图中的任何公共关键字在结果地图中表示,其值是两个地图的两个值的合并.在代码中,这是我迄今为止所拥有的:
@SuppressWarnings("unchecked")
public Map<String,Object> merge(final Map<String, Object> map1,
final Map<String, Object> map2) {
final Map<String,Object> merged = new HashMap<String,Object>(map1);
for (final Map.Entry<String,Object> entry : merged.entrySet()) {
final String key = entry.getKey();
final Object value = entry.getValue();
if (map2.containsKey(key)) {
final Object value2 = map2.get(key);
if ((value instanceof Map) && (value2 instanceof Map)) {
merged.put(key, merge((Map<String, Object>) value, (Map<String, Object>) value2));
} else if ((value instanceof Set) && (value2 instanceof Set)) {
final Set<Object> set = new HashSet<Object>((Set<Object>)value);
set.addAll((Set<Object>) value2);
merged.put(key, set);
} else {
// throw up, should only ever be a map or a set
}
}
}
for (final String key : map2.keySet()) {
if (!merged.containsKey(key)) {
merged.put(key, map2.get(key));
}
}
return merged;
}
它完成了这项工作,但是我对它的使用感到不满意,因为你正在使用它来投射大量的东西,它也会对你正在使用的Set和Map实现做出假设.鉴于我知道我总是处理字符串映射到某些东西,其中某些东西是一组字符串或另一个字符串映射到某些东西,我试图弄清楚如何使用泛型来规范这个.我在这里的其他答案中摆弄了类似但不完全相同的方法,例如方法签名如:
public <T extends Map<String,T>> Map<String,T> merge(final T map1, final T map2)
但这没有用,因为递归调用不喜欢我尝试输入Map< String,Set< String>>的参数.
我承认以前从来没有必要深入了解仿制药.任何指导都非常感谢.
解决方法:
重新假设你正在使用的Set和Map实现:如果你总是创建新的地图和集合,你至少可以避免这种情况 – 这有一个很好的附带好处,即如果有人修改原始集合,它不会搞砸你的合并版.
至于你的要点,没有强制转换就没有办法在Java中做到这一点.泛型无法帮助你,因为在运行时,编译器不仅仅知道
Map<String, Object> merge ( Map<String, ?> map1, Map<String, ?> map2 )
在代码中,您实际上并不知道是否有Map< String,Set< String>> ;,Map< String,Map< String,Set< String>>或Map< String,Object>其中一些值是Set< String>和其他值是Map< String,Set< String>> – 在第三种情况下它仍然有效,只要对于每个键,两个映射都具有相同的值类型.
矛盾的是,摆脱警告的最好方法是摆脱泛型,此时,只使用运行时可用的信息(Map或Set,我们不关心什么),所有演员都是安全的:
public Map<Object, Object> merge ( Map<?, ?> map1, Map<?, ?> map2 )
{
Map<Object, Object> merged = new HashMap<Object, Object>();
if ( map1 == null || map2 == null )
{
if ( map1 != null )
{
merged.putAll( map1 );
}
if ( map2 != null )
{
merged.putAll( map2 );
}
return merged;
}
Set<Object> allKeys = new HashSet<Object>();
allKeys.addAll( map1.keySet() );
allKeys.addAll( map2.keySet() );
for ( Object key : allKeys )
{
Object v1 = map1.get( key );
Object v2 = map2.get( key );
if ( v1 instanceof Set || v2 instanceof Set )
{
Set<Object> newSet = new HashSet<Object>();
if ( v1 instanceof Set )
{
newSet.addAll( (Set) v1 );
}
if ( v2 instanceof Set )
{
newSet.addAll( (Set) v2 );
}
merged.put( key, newSet );
}
else if ( v1 instanceof Map || v2 instanceof Map )
{
Map<?, ?> m1 = v1 instanceof Map ? (Map<?, ?>) v1 : null;
Map<?, ?> m2 = v2 instanceof Map ? (Map<?, ?>) v2 : null;
merged.put( key, merge( m1, m2 ) );
}
}
return merged;
}
内容总结
以上是互联网集市为您收集整理的java – 使用泛型递归合并Maps全部内容,希望文章能够帮你解决java – 使用泛型递归合并Maps所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。