【问题标题】:Java HashMap in methods方法中的 Java HashMap
【发布时间】:2014-12-27 02:36:44
【问题描述】:

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

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

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

或者,是否可以检查映射的键/值类型,而不是遍历所有键/值并检查 instanceof(不通过 return 停止它)?

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。所以我也需要一些通用的返回类型。感谢到目前为止的答案,并感谢正手的答案!

【问题讨论】:

  • Java 中的“通用”数据类型是Object
  • 嗯,你可以有public &lt;T&gt; void example(HashMap&lt;String, T&gt; hashMap);但是我看不到您需要HashMap 而不是常规的Map
  • 您是否只是在尝试实现一个 Map 您希望在其中使用不区分大小写的键?如果是这样,请查看stackoverflow.com/questions/8236945/…

标签: java hashmap


【解决方案1】:

你可以这样做:

HashMap<String, Object>

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

另外,你可以定义一个HashMap如下:

HashMap<String, ? extends SomeClass>

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

最后,正如我在评论中指出的那样,您似乎只是在尝试实现 Map&lt;key, value&gt;,您希望在其中使用不区分大小写的键。如果是这样,请查看www.stackoverflow.com/questions/8236945/

【讨论】:

    【解决方案2】:

    是的,但要求Map&lt;String, Value&gt; 更好。如果您不关心 Map&lt;String, ?&gt; 的价值是什么。如果你知道但还不知道会是什么,请使用Map&lt;String, ? extends T&gt;

    要求 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;
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      答案是使用 CaseInsensitiveMap。感谢大家帮助我,尤其是 David Brossard 提出的建议。

      【讨论】:

        【解决方案4】:

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

        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&lt;String,V&gt; 可以为“Key”“key”保存一个值,而一个 case -less Map 不会。此方法会任意选择其中一个,而无大小写的 Map 会选择最近添加的。

        【讨论】:

          猜你喜欢
          • 2014-10-29
          • 2013-12-10
          • 2019-04-27
          • 1970-01-01
          • 2013-06-25
          • 2016-08-01
          • 1970-01-01
          • 2015-05-12
          • 2018-11-13
          相关资源
          最近更新 更多