2

我想访问 java.util.HashMap 而不考虑键的大小写。

我的意思是,如果我在我的 HashMap 中添加以下条目:

java.util.HashMap<String, Object> myMap = new java.util.HashMap<String, Object>();
myMap.put("foo", new Foo());  // Note lower-case key used here

然后我应该能够通过以下代码获取 Foo 对象:

Foo f = (Foo) myMap.get("FOO"); // Note UPPER-case key used here

这可能吗?

谢谢。

4

7 回答 7

9
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class TestEnum {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String, String> oldMap = new HashMap<String, String>();
        oldMap.put("akshay", "Lokur");
        oldMap.put("sumiT", "BORhade");

        Map<String, String> newMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
        newMap.putAll(oldMap);
        String value = newMap.get("AKShay");
        System.out.println(value);
    }

}
于 2013-02-05T07:44:35.073 回答
4

子类化 HashMap 以使用您自己的“MyIgnoreCaseHashMap”:

public class MyIgnoreCaseHashMap extends HashMap<String, Object> {

    Object get(String key) {
       return super.get(key.toLowercase());
    }

    void put(String key, Object value) {
       super.put(key.toLowerCase(), value);
    }
}

这总是以小写版本处理键。此外,请考虑覆盖可能使用键的方法,例如 containsKey。

如果你不介意包含外部库,apache-commons 有 CaseInsensitiveMap 类来解决你的问题

于 2013-02-05T07:30:02.333 回答
1

我不确定你为什么需要这个:

但考虑添加myMap喜欢

myMap.put("foo".toLowerCase(), new Foo());

并检索喜欢

Foo f = (Foo) myMap.get("FOO".toLowerCase());
于 2013-02-05T07:27:44.937 回答
1

简单的解决方案是在使用之前将所有键转换为大写,如下所示:

myMap.put (key.toUpperCase (), value);
String value = myMap.get (anotherKey.toUpperCase ());
于 2013-02-05T07:28:39.440 回答
0

您可以通过在将对象推送/检索到地图之前将键转换为大写字母来做到这一点。像:

myMap.put("foo".toUpperCase(), new Foo());

Foo f = myMap.get("foo".toUpperCase());

或者

myMap.put("foo".toLowerCase(), new Foo());

Foo f = myMap.get("foo".toLowerCase());
于 2013-02-05T07:27:09.727 回答
0

如果您不想在使用地图时重复使用“toLowerCase”,则可以为此创建自己的 HashMap 子类。覆盖get, put, containsKey, 并将remove键转换为小写,然后在超类中使用此小写键调用相应的函数。

请注意,toLowerCase()/toUpperCase()的行为因语言环境而异,因此存在仅根据 JVM 运行位置而获得不同结果的风险。这可能需要也可能不需要,具体取决于您将哪些字符串用作键(用户输入、硬编码等)。考虑toUpperCase(Locale locale)是否需要一致的大小写规则。

于 2013-02-05T07:38:44.627 回答
0

对于一个完整的例子,看看 Apache Commons db utils... 具体来说,来源私有内部类org.apache.commons.dbutils.BasicRowProcessor$CaseInsensitiveHashMap

https://apache.googlesource.com/commons-dbutils/+/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java

这在一些 JDBC 驱动程序中用于访问映射,这些映射是不区分大小写的列名数据库(如 Oracle)中的结果查询。

于 2014-01-17T02:48:04.063 回答