【问题标题】:Extract value from the map basis on which key is present [duplicate]从存在键的地图基础中提取值[重复]
【发布时间】:2017-11-04 07:50:12
【问题描述】:

我需要从映射中获取 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 是一个数字,所以我不能在这里使用 for 循环逻辑。

【问题讨论】:

  • 如果键可以是 any 名称,也许你会从地图中获取第一个值? ;)
  • 除了我要找的那把钥匙之外,这张地图还有很多其他的东西。
  • 这意味着你知道你在寻找什么,并且 key 属于一组可能的值

标签: java hashmap


【解决方案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;
    }
}

【讨论】:

  • 我刚想出的那些名字userx。它通常可以是任何名称。让我澄清一下这个问题。
  • 更新了答案。
【解决方案2】:

您应该引入一个辅助方法,该方法提供一个 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");

【讨论】:

    【解决方案3】:

    我会将可能的键包装在一个列表中并对其进行迭代:

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

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2018-01-03
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多