找出两张地图之间的差异

时间:2017-10-31 19:46:02

标签: java guava

我有两张当前和之前的地图,我想看看两张地图之间是否有任何差异。如果当前地图中存在新密钥,或者同一密钥的值不同,我可以停止。

Map<String, String> previousValue;
Map<String, String> currValue;

boolean isChangePresent = currValue.entrySet().stream().anyMatch(
                    x -> !previousValue.containsKey(x.getKey()) ||
                        (previousValue.get(x.getKey()) != null && !previousValue.get(x.getKey()).equals(
                            x.getValue())));

有没有更好的方法来执行此操作或内置的实用程序功能可以执行此类操作?

2 个答案:

答案 0 :(得分:5)

在番石榴:

PACKAGECONFIG_append_pn-php = " apache2 " 

EXTRA_OECONF = "--enable-mbstring \
                --enable-wddx \
                --enable-fpm \
                --enable-zip \
                --with-libdir=${baselib} \
                --with-gettext=${STAGING_LIBDIR}/.. \
                --with-zlib=${STAGING_LIBDIR}/.. \
                --with-openssl=${STAGING_DIR_TARGET}${exec_prefix} \
                --with-iconv=${STAGING_LIBDIR}/.. \
                --with-mcrypt=${STAGING_DIR_TARGET}${exec_prefix} \
                --with-bz2=${STAGING_DIR_TARGET}${exec_prefix} \
                --with-config-file-path=${sysconfdir}/php/apache2-php${PHP_MAJOR_VERSION} \
                ${@base_conditional('SITEINFO_ENDIANNESS', 'le', 'ac_cv_c_bigendian_php=no', 'ac_cv_c_bigendian_php=yes', d)} \
                ${@bb.utils.contains('PACKAGECONFIG', 'pam', '', 'ac_cv_lib_pam_pam_start=no', d)} \
                ${COMMON_EXTRA_OECONF} \
"

https://www.leveluplunch.com/java/examples/guava-map-difference-example/

答案 1 :(得分:3)

由于您的密钥和值只是Strings,因此他们的.equals()方法检查逻辑相等(而不是检查它们是否具有相同的内存地址),因此您只需使用

boolean check(Map<String, String> a, Map<String, String> b) {
     return a.equals(b);
}

请注意,例如,如果您有两个Map<K,V>类型的地图,其中V没有覆盖.equals()方法,默认等于{{1}的方法}不检查逻辑相等,然后它将无法工作。

修改

如果V keySet previousMap包含currentMap 的所有键,但,您是否会考虑更改?密钥少于currentMap previousMap?如果您认为无变化那么您需要做的是

boolean check(Map<String, String> previous, Map<String, String> current) {
         Map<String,String> copyOfPrev = new HashMap<>();
         previous.forEach((k,v) -> copyOfPrev.put(k,v));
         copyofPrev.keySet().retainAll(current.keySet());
         return copyOfPrev.equals(current);
    }

请记住,Map<K, V>#keySet().retainAll(Collection<K> c)会修改基础地图,因此深层副本是为了防止更改之前的地图。如果您可以更改上一张地图,那么您只需删除该方法正文的前三行,然后将copyOfPrev更改为previous