Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-仅比较特定键的两个映射条目_Java_Dictionary_Compare_Equals - Fatal编程技术网

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);
  }