我们可以从hashmap获取值而不考虑String键的情况吗?

时间:2013-02-05 07:24:13

标签: java collections hashmap

我想访问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

这可能吗?

感谢。

7 个答案:

答案 0 :(得分: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);
    }

}

答案 1 :(得分: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类来解决你的问题

答案 2 :(得分:1)

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

但请考虑添加myMap喜欢

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

并检索

Foo f = (Foo) myMap.get("FOO".toLowerCase());

答案 3 :(得分:1)

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

myMap.put (key.toUpperCase (), value);
String value = myMap.get (anotherKey.toUpperCase ());

答案 4 :(得分: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());

答案 5 :(得分:0)

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

请注意,toLowerCase() / toUpperCase()的行为会因区域设置而异,因此您可能会根据JVM的运行位置获得不同的结果。根据您使用的键作为键(用户输入,硬编码等),这可能是也可能不可取。如果您需要一致的套管规则,请考虑toUpperCase(Locale locale)

答案 6 :(得分: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)中的结果查询。