Java-仅比较特定键的两个映射条目
假设我有两张地图:Java-仅比较特定键的两个映射条目,java,dictionary,compare,equals,Java,Dictionary,Compare,Equals,假设我有两张地图: Map<String, String> map1 = Map.of( "a", "1", "b", "2", "c", "3", "x", "9" ); Map<String, String> map2 = Map.of( "z", "9" "a", "1", "b", "2", "c", "3"
Map<String, String> map1 = Map.of(
"a", "1",
"b", "2",
"c", "3",
"x", "9"
);
Map<String, String> map2 = Map.of(
"z", "9"
"a", "1",
"b", "2",
"c", "3"
);
但是,如果有更多的键需要检查,那么这是非常低效的,代码也很难闻。在这种情况下,更好的方法可以是:
public boolean customEquals(Map map1, Map map2){ //please ignore NullPointerException
return map1.get("a").equals(map2.equals("a"))
&& map1.get("b").equals(map2.equals("b"))
&& map1.get("c").equals(map2.equals("c"));
}
public boolean customEquals(Map map1, Map map2) { //please ignore NullPointerException
Set<String> keys = Set.of("a", "b", "c");
for (String key : keys) {
if (!(map1.get(key).equals(map2.get(key)))) {
return false;
}
}
return true;
}
public boolean customEquals(映射map1,映射map2){//请忽略NullPointerException
设置键=一组(“a”、“b”、“c”);
用于(字符串键:键){
if(!(map1.get(key).equals(map2.get(key))){
返回false;
}
}
返回true;
}
有没有更好的办法?(您也可以推荐流行的库函数)首先从
map1
或map2
到列表中获取key=[a,b,c]的条目
List<SimpleEntry<String,String>> res = Stream.of("a","b","c")
.map(key->new AbstractMap.SimpleEntry<String,String>(key, map1.get(key)))
.collect(Collectors.toList());
我们也可以将两者合并为一行
Stream.of("a","b","c")
.map(key->new AbstractMap.SimpleEntry<String,String>(key, map1.get(key)))
.allMatch(entry->map2.entrySet().contains(entry));
“a”、“b”、“c”流
.map(key->newAbstractMap.SimpleEntry(key,map1.get(key)))
.allMatch(entry->map2.entrySet().contains(entry));
私有静态地图筛选(地图地图、集合键){
var entries=map.entrySet()
.stream()
.filter(entry->keys.contains(entry.getKey()))
.toArray(地图条目[]::新建);
返回入口地图(入口);
}
(在上面运行)
可能不是更好的方法,但我更喜欢使用
Stream
s来过滤映射。if(map1.get(key).equals(map2.equals(key)){return false;}
edit:if条件不应等于。在问题中,他说忽略NullPointerException我选择这一个作为公认的答案,因为它是最干净的解决方案,不会创建太多新对象,也不会完全满足我的目的代码>我的目标是检查是否等于。请编辑和更新好吗?内部包含使用equals方法比较字符串对象@tamemkhansorry以避免误解,感谢您的澄清!
Stream.of("a","b","c")
.map(key->new AbstractMap.SimpleEntry<String,String>(key, map1.get(key)))
.allMatch(entry->map2.entrySet().contains(entry));
Stream.of("a","b","c").allMatch(key -> map1.get(key).equals(map2.get(key)));
private static <K, V> Map<K, V> filterEntries(Map<K, V> map, Collection<K> keys) {
var entries = map.entrySet()
.stream()
.filter(entry -> keys.contains(entry.getKey()))
.toArray(Map.Entry[]::new);
return Map.ofEntries(entries);
}