有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中,字典随机访问给定密钥的映射条目

我有一本类型为Map<?, String>的字典。运行时密钥类型未知。我仍然可以用字符串调用get(),如果存在这样的元素,我就可以正确地得到存储的对象

现在我修改该对象,并希望将其放回字典中。理想情况下,我想做这样的事情:

    Map<String, String> hat = new HashMap<>();
    hat.put("bunny", "rabbit");
    Map<?, String> magicHat = hat;
    String trick = magicHat.get("bunny");
    if (trick != null) {
        trick = "jack".concat(trick);
        magicHat.put("bunny", trick);
    }

但是,可以理解的是,调用magicHat.put("bunny", trick);会产生以下编译错误:incompatible types: String cannot be converted to CAP#1

解决此问题的一种方法是使用streams(或迭代)获取贴图的条目,然后使用该条目修改值:

    Map.Entry<?, String> entry = magicHat.entrySet()
        .stream()
        .filter(e -> "bunny".equals(e.getKey()))
        .findFirst()
        .orElse(null);
    if (entry != null) {
        String trick = "jack".concat(entry.getValue());
        entry.setValue(trick);
    }

然而,在现实生活中,我必须使用Java6,无法承受流的舒适性。迭代所有条目似乎效率低下

有没有一种优雅的方法可以随机访问地图中的某个条目(给定其密钥)

Here is不编译的代码,以及here is解决方法

谢谢你的见解


共 (1) 个答案

  1. # 1 楼答案

    您应该将键类型设置为Object,而不是通配符(?)。这样,你就不必知道类型了。但是,您应该确保从不在地图中存储不同类型的键

    Map<String, String> hat = new HashMap<>();
    hat.put("bunny", "rabbit");
    Map<Object, String> magicHat = new HashMap<>();
    hat.forEach(magicHat::put); // Edit: Added this
    String trick = magicHat.get("bunny"); // String extends Object
    if (trick != null) {
        trick = "old".concat(trick);
        magicHat.put("bunny", trick);
    }
    

    在大多数情况下,这个问题的解决方案是使用泛型类型变量。这样,您仍然具有类型安全性,但不必在编译时知道密钥类型