2013-02-05 29 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)