方法中的Java HashMap

时间:2014-10-30 21:13:14

标签: java hashmap

是否有可能有一个需要HashMap的方法,并能够提供任何带字符串的HashMap作为键?某种类型的通用数据类型而不是'值'?

public void example(HashMap<String, Value> hashMap) {
    //Stuff
}

example(new HashMap<String, Integer>);
HashMap<String, String> exampleMap = new HashMap<>();
example(exampleMap);

或者,是否可以检查地图的键/值类型,而不是循环遍历所有键/值并检查instanceof(不通过返回来停止它)?

public Boolean example(HashMap<String, Value> hashMap) {
    for (Value value : hashMap.values())) {
        if (value instanceof String) {
            return true; //<- Unwanted
        }
    }
}

编辑: 让我再解释一下我的问题。我有一个方法:

public static Object getEIC(HashMap<String, Object> map, String key) {
    for (String keys : map.keySet()) {
        if (keys.equalsIgnoreCase(key)) {
            return map.get(keys);
        }
    }
    return null;
}

EIC代表equalsIgnoreCase。所以我也需要一些泛型返回类型。感谢到目前为止的答案,并感谢正面答案!

4 个答案:

答案 0 :(得分:3)

你可以这样做:

HashMap<String, Object>

但这太糟糕了,因为那时你最终都在做一个例子。你真正需要做的是了解关键问题是什么,然后考虑继承。您能定义一个所有值对象都将实现的接口吗?例如,GeometricShape可以通过Rectangle和Circle实现。

此外,您可以按如下方式定义HashMap:

HashMap<String, ? extends SomeClass>

正如其他人指出的那样,最好使用接口Map而不是特定的实现,例如HashMap中。

最后,正如我在评论中指出的那样,您似乎只是想尝试在Map<key, value>中使用不区分大小写的键。如果有,请查看www.stackoverflow.com/questions/8236945/

答案 1 :(得分:0)

是的,但要求Map<String, Value>更好。如果你不在乎要求Map<String, ?>的价值。如果你这样做但还不知道它会是什么,请使用Map<String, ? extends T>

要求HashMap正在编程实现而不是接口。这样做的理由很少。

不。如果您不相信构建地图的人并且想要确保地图仅包含它应包含的类型,则必须循环并检查每个地图。但是,您可以通过一种方法对其进行抽象,这种方法会检查您,因此您无需查看它。

public class CheckedCast
{

    public static <K,V> Map<K,V> mapOf(Class<? extends K> classK, 
                                       Class<? extends V> classV, 
                                       Map<?,?> m)
    {
        for (Map.Entry<?, ?> e: m.entrySet())
        {
            classK.cast( e.getKey() );
            classV.cast( e.getValue() );
        }

        @SuppressWarnings("unchecked")
        Map<K,V> result = (Map<K,V>) m;
        return result;

    }
}

答案 2 :(得分:0)

答案是使用CaseInsensitiveMap。谢谢,大家,帮助我,特别是David Brossard提出建议。

答案 3 :(得分:0)

您可以使用泛型实现您正在寻找的静态方法:

public static <V> V getEIC(Map<String, V> map, String key) {
    for (String k : map.keySet()) {
        if (k.equalsIgnoreCase(key)) {
            return map.get(key);
        }
    }
    return null;
}

但是,您可能希望考虑使用增强型Map Is there a good way to have a Map<String, ?> get and put ignoring case?

但请注意,此解决方案与使用无大小写的等号之间存在细微差别 - 普通Map<String,V>可以为“键”“键”保留值无案Map不会。这种方法会随意选择其中一种,而无案Map会选择最近的添加。

相关问题