2013-02-05 28 views
1

我想访问java.util.HashMap而不考虑密钥的大小写。不考虑String键的情况,能从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

请注意,在不考虑区域设置的情况下讨论大小写没有意义。根据底层操作系统的配置,'I'的较低形式可以是'i'或'ı'。 – McDowell

+0

相关:[Java:收集RemoveAll忽略情况?](http://stackoverflow.com/questions/1241460/) – McDowell

回答

8
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); 
    } 

} 
+0

这个工作...谢谢:) –

+0

从文档:注意,像树形图保存的排序,像任何有序的映射,以及是否提供显式比较器,必须与equals相等,如果这个有序映射是正确实施Map界面._正在违反类合同。 – McDowell

+1

关闭@McDowell,你能否轻松预测在'oldMap.put(“foO”,“bar1”)后面运行'newMap.get(“foo”)'会发生什么? oldMap.put(“fOo”,“bar2”);'? – Windle

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()); 
+1

但我没有控制在地图上放置大写键。 –

+0

然后它是一个有点棘手。如果你确定大写和小写是相同的,你可以尝试两个get(一个用“foo”.toUpperCase()和一个用“foo”.toLowerCase()一个简单的if会告诉你哪个键包含一个值或者如果两者都不包含一个。当然,如果两个键都检索一个值,将会很困难:) – Matthias

+1

由于您无法控制对地图的放置,因此无法更改大小写或将字符串对象封装为另一个对象提供string.toLowerCase()的散列。考虑用改变的键重新创建地图。 –

1

我不知道为什么你需要这样的:

但考虑添加到myMap

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

和检索像

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

同样,我没有控制在地图上放置小写键。 –

+0

这不是问题的答案。很明显,OP不知道Hashmap中的关键是什么形式,这就是他关心的原因。如果他能做到这一点,他不会问。 –

+0

@RohitJain,这个问题本身并不是很清楚。我可以看到OP的一些新的评论,但他说他自己添加了。那么为什么不修改这样的代码呢? –

1

简单的解决方法就是将所有键大写像这样使用前:

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

子类来使用自己的“MyIgnoreCaseHashMap” HashMap的:

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的公地有CaseInsensitiveMap类旋转你的问题,只要您使用的地图

+0

这是OP问题的唯一解决方案。您还可以添加为什么原稿不起作用。 –

+1

'containsKey'呢? –

+0

这真的是明显的解决方案! –

0

如果你不想重复使用“toLowerCase” ,你可以为此创建你自己的HashMap的子类。覆盖get,put,containsKeyremove将键转换为小写,然后在超类中使用此小写键调用适当的函数。

请注意,toLowerCase()/toUpperCase()的行为因语言环境而异,因此存在单纯根据JVM的运行位置得到不同结果的风险。这取决于您用作键的字符串(用户输入,硬编码等),这可能也可能不需要。如果您需要一致的套管规则,请考虑toUpperCase(Locale locale)