我的應用程序將從另一個應用程序收到Hashmap<String,Object>
。如何修剪字符串鍵在哈希圖
是否有任何方法修剪字符串鍵而不迭代導致性能降級的散列映射becoz Hashmap可能包含大量實際數據條目。
感謝
我的應用程序將從另一個應用程序收到Hashmap<String,Object>
。如何修剪字符串鍵在哈希圖
是否有任何方法修剪字符串鍵而不迭代導致性能降級的散列映射becoz Hashmap可能包含大量實際數據條目。
感謝
有一件事要事先說明:
地圖可能包含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]));
你有兩個選擇:
在你的榜樣,你別無選擇前修剪,你需要遍歷這些鍵。
儘管在java 8中,您可以使用pararell流來增強這種操作。但我不會在多線程環境中推薦它。
如果沒有辦法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());
}
您可以在添加到HashMap之前進行修剪。 – DnR 2014-10-17 05:59:10
@DnR他寫道,他從另一個應用程序獲取地圖,我不認爲這是一個選項。 – icza 2014-10-17 06:04:25
你爲什麼要修剪你的HashMap的數據?是否因爲你的業務邏輯更適合它? – SamDJava 2014-10-17 06:05:13