从存在键的映射基础中提取值

时间:2017-06-02 20:12:48

标签: java hashmap

我需要从地图中获取userId值,并且可以在user1密钥或user2密钥或user3密钥或user4密钥中显示在地图上。地图中一次只能出现一个密钥,不会出现多个密钥。

所以我开始使用下面的代码来检查user1是否存在以及是否存在提取user1键值,否则提取user2键值。我应该继续添加user3user4检查吗?如果是,它会变得很长......

Map<String, String> holder = Utils.parseStringToMap(payload);
String userId = holder.containsKey("user1") ? holder.get("user1") : holder.get("user2");

根据存在的密钥,有没有更好的方法可以提取userId值?我使用的是Java 7。

注意:此处该字段的地图中的键名可以是任何名称。它不是userx,其中x是一个数字,所以我不能在这里使用循环逻辑。

3 个答案:

答案 0 :(得分:1)

您可以循环迭代键:

for (int i = 1; i <= 4; i++) {
    final String key = "user" + i;
    if (holder.containsKey(key)) {
        // ... process the found key and value
        break;
    }
}

这将允许您以后通过更改上限(此示例中为4)轻松扩展您的键空间。

如果您的名字没有像userX这样的常见模式,您可以有一个明确的列表:

String[] keys = {"key1", "user2", "somethingelse"};
for (final String key : keys) {
    if (holder.containsKey(key)) {
        // ... process the found key and value
        break;
    }
}

答案 1 :(得分:1)

您应该引入一个帮助方法,该方法提供var-args参数来传输任何userId String以匹配。
它更具可读性和灵活性 例如:

public String getUserId(Map<String, String> valueByUserIds, String... userIdsToMatch){
   for (String userIdToMatch : userIdsToMatch){
       if (holder.containsKey(userIdToMatch)){
         // or spare an invocation by using only holder.get(userIdToMatch) if the value should never be null
          return holder.get(userIdToMatch);
       }
   }
   return null; // or throw an exception
}

你可以这样使用它:

Map<String, String> holder = Utils.parseStringToMap(payload);
String userValue = getUserId(holder, "user1");
String userValue = getUserId(holder, "user1", "user2");
String userValue = getUserId(holder, "user1", "user2", "user3");

答案 2 :(得分:0)

我将可能的密钥包装在列表中并迭代它们:

private static String getFromFirstKey
    (Map<String, String> map, List<String> keys) {
    for (String key : keys) {
        if (map.containsKey(key)) {
            return map.get(key);
        }
    }
}

public static void main(String[] args) {
    Map<String, String> holder = Utils.parseStringToMap(payload);
    String userId =
      getFromFirstKey(holder, Arrays.asList("user1", "user2", "user3", "user4"));
}