如何将数组列表中的给定键与HashMap键进行比较?

时间:2019-05-21 15:07:40

标签: java arrays hashmap compare

在我的WebApplication中,我必须检查来自requestBody的许多传入查询参数。为了不在每个方法中编写相同的代码,我想编写一个返回布尔值的函数。当接收到所有必需的参数并且entrySet的值不为null时,该方法应返回true(否则为false),稍后我可以在程序中使用传入的查询参数。

因此,我将所有传入参数打包到HashMap中。另外,我在方法中放入了一个特定的列表,该列表提供了检查所需的参数(键)。

queryParams的示例图:

Map queryParams = new HashMap();

queryParams.put("id", "1");
queryParams.put("name", "Jane");
queryParams.put("lastname", "Doe");

示例数组:

String[] keys = {"id", "name", "lastname"};

方法的最新版本:



public static Boolean checkRequestParams(Request request, String[] keys) {
        Map params = (JsonUtil.fromJson(request.body(), HashMap.class));

        Iterator it = params.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            for (int i = 0; i < keys.length; i++) {
                if (pair.getKey().equals(keys[i])) {
                    return true;
                }

            }

Array提供了作为客户端发送的QueryParams的键。不,我想比较它们,并检查Hashmap中的键是否等于数组中给定的键,以及Map中的键的值是否不为空。

我尝试了许多变化。我得到nullPointerExceptions还是总是返回null。

4 个答案:

答案 0 :(得分:1)

我可能是错的,但是据我了解,您想验证以下条件:

  1. HashMap键必须属于关键字{"id", "name", "lastname"}的以下列表。
  2. HashMap中的任何值都不应等于null。

您可能会使用与此类似的内容:

map.entrySet()
   .stream()
   .allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null)

因此,我们遍历entrySet并检查entry键是否属于已定义的集以及value是否不为null。 这是更详细的示例:

Set<String> keys = Set.of("id", "name", "lastname");
Map<String,List<Integer>> map = Map.of("id", List.of(1,2,3), "name", List.of(4,5,6));

map.entrySet()
        .stream()
        .allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);

Map<String,List<Integer>> map1 = Map.of("id", List.of(1,2,3), "not in the keys", List.of(4,5,6));
map1.entrySet()
        .stream()
        .allMatch(entry -> keys.contains(entry.getKey()) && entry.getValue() != null);

请注意,我正在使用collections工厂方法来创建MapListSet,这些方法已添加到Java-9中,但是从Java-8开始就可以使用流api。

对于您的代码,您将始终获得true,因为只要有一个满足条件的entrySet,该方法就会返回结果。

for (int i = 0; i < keys.length; i++) {
                if (pair.getKey().equals(keys[i])) {
                    return true; // one single match found return true. 
                }

            }

您可以尝试逆转条件,并在不匹配时立即返回false。

for (int i = 0; i < keys.length; i++) {
                if (!pair.getKey().equals(keys[i]) || pair.getValue() == null) {
                    return false; // mismatch found, doesn't need to verify 
                    // remaining pairs. 
                }

            }
return true; // all pairs satisfy the condition. 

希望您觉得这有用。

答案 1 :(得分:0)

如果找到匹配项,则不应立即返回,因为我们要测试“所有必需的”参数。尝试类似的东西:

String[] keys = {"id, "name", "lastname"};
public static Boolean checkRequestParams(Request request, String[] keys) {
    Map params = (JsonUtil.fromJson(request.body(), HashMap.class));
    for (int i = 0; i < keys.length; i++) {
        Iterator it = params.entrySet().iterator();
        boolean found = false;
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry) it.next();
            if (pair.getKey().equals(keys[i])) {
                found = true;
                break;
            }
        }
        if (!found) {
            return false;
        }
    }
    return true;
}

答案 2 :(得分:0)

只需使用香草Java,您就可以尝试这样的事情。

SupportMapFragment

但是我建议您使用验证框架,如果您的项目允许它进行更准确的验证。

答案 3 :(得分:0)

您要在第一个匹配键上返回true,而您要检查是否存在所有键。此外,您的代码不完整,因此无法进行完整的诊断。

但是无论如何,在这里遍历地图是没有意义的。只需使用

public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    for(String key: keys) {
        if(params.get(key) == null) return false;
    }
    return true;
}

这将确保每个键都存在并且不映射到null(因为“不映射到null”已经暗示存在)。

在不考虑显式映射到null的可能性时,您可以像检查所有键一样简单

public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    return params.keySet().containsAll(Arrays.asList(keys));
}

或者,如果任何映射值是null,即使其键不是必需键之一,也可以认为该映射无效。然后,就像

public static Boolean checkRequestParams(Request request, String[] keys) {
    Map<?,?> params = JsonUtil.fromJson(request.body(), HashMap.class);
    return params.keySet().containsAll(Arrays.asList(keys))
        && !params.values().contains(null);
}