2014-10-17 14 views
1

我的應用程序將從另一個應用程序收到Hashmap<String,Object>如何修剪字符串鍵在哈希圖

是否有任何方法修剪字符串鍵而不迭代導致性能降級的散列映射becoz Hashmap可能包含大量實際數據條目。

感謝

+3

您可以在添加到HashMap之前進行修剪。 – DnR 2014-10-17 05:59:10

+0

@DnR他寫道,他從另一個應用程序獲取地圖,我不認爲這是一個選項。 – icza 2014-10-17 06:04:25

+2

你爲什麼要修剪你的HashMap的數據?是否因爲你的業務邏輯更適合它? – SamDJava 2014-10-17 06:05:13

回答

1

有一件事要事先說明:

地圖可能包含2個鍵第一個是第二個的修剪版本。通過做你想做的,它會覆蓋/從地圖中刪除其中的一個!例如。地圖可能包含密鑰"a ""a",通過修改密鑰,其中一個將消失!


HashMap沒有提供任何方式來操作鍵而不迭代它們。

您可以「複製」的條目與密鑰的新地圖修整(如@ RuchiraGayanRanaweera的解決方案),或者你可以在同一地圖是這樣做的:

解決方案#1:重複的條目設置和替換不同的鍵

所以你可能要做的是遍歷條目,並修剪鍵。這也意味着,如果修剪後的按鍵與原稿不相同,則必須使用舊的按鍵移除輸入,然後再使用新的按鍵。你只需要更換的條目,修剪的版本是不同的:

Map<String, Object> map = new HashMap<>(); 
for (Entry<String, Object> entry : new HashSet<>(map.entrySet())) { 
    String trimmed = entry.getKey().trim(); 
    if (!trimmed.equals(entry.getKey())) { 
     map.remove(entry.getKey()); 
     map.put(trimmed, entry.getValue()); 
    } 
} 

注意,有必要創建條目集的新Set因爲從HashMap.entrySet() javadoc中引述:

如果在對集合進行迭代的過程中(除了通過迭代器自己的刪除操作,或通過迭代器返回的映射條目上的setValue操作除外),映射會被修改,迭代的結果是未定義的。

解決方案2:收集第一則更換不同的密鑰

另一種選擇是,以收集在修整關鍵是不同的密鑰,只有那些在第一次迭代後更改。該解決方案的優點是不必「複製」條目集以迭代它。如果相對較少的按鍵的修剪變體不同,可能這是最快的解決方案:

Map<String, Object> map = new HashMap<>(); 
// Set to store the modified keys, 
// Also store the trimmed String for performance reasons 
Set<String[]> modifiedSet = new HashSet<>(); 
for (Entry<String, Object> entry : map.entrySet()) { 
    String trimmed = entry.getKey().trim(); 
    if (!trimmed.equals(entry.getKey())) 
     modifiedSet.add(new String[]{entry.getKey(), trimmed}); 
} 

// Changing a key can be done in one step: 
// Removing the old entry (which returns the old value) and put the new 
for (String[] modified : modifiedSet) 
    map.put(modified[1], map.remove(modified[0])); 
2

你有兩個選擇:

  • 通過MapEntries廣告更新添加
  • 迭代所有的鍵

在你的榜樣,你別無選擇前修剪,你需要遍歷這些鍵。

儘管在java 8中,您可以使用pararell流來增強這種操作。但我不會在多線程環境中推薦它。

1

如果沒有辦法trim()鍵添加到HashMap之前,那麼你必須這樣做以下:

HashMap<String,Object> map=new HashMap<>(); 
HashMap<String,Object> newMap=new HashMap<>(); 
for(Map.Entry<String,Object> entry:map.entrySet()){ 
    newMap.put(entry.getKey().trim(),entry.getValue()); 
}