我想访问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
这可能吗?
感谢。
答案 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子类。覆盖get
,put
,containsKey
和remove
以将密钥转换为小写,然后使用超类中的此小写密钥调用相应的函数。
请注意,toLowerCase()
/ toUpperCase()
的行为会因区域设置而异,因此您可能会根据JVM的运行位置获得不同的结果。根据您使用的键作为键(用户输入,硬编码等),这可能是也可能不可取。如果您需要一致的套管规则,请考虑toUpperCase(Locale locale)
。
答案 6 :(得分:0)
有关完全充实的示例,请查看Apache Commons db utils ...具体来说,来源私有内部类 org.apache.commons.dbutils.BasicRowProcessor $ CaseInsensitiveHashMap
这在一些JDBC驱动程序中用于访问映射,这些映射是不区分大小写的列名数据库(如Oracle)中的结果查询。