我的应用会从其他应用中收到Hashmap<String,Object>
。
有没有办法修剪字符串键而不迭代hashmap导致性能降级becoz Hashmap可能包含大量实际数据条目。
由于
答案 0 :(得分:2)
您有两种选择:
在您的示例中,您别无选择,需要迭代这些键。
在Java 8中,你可以使用pararell流来增强这种操作。但我不建议在多线程环境中使用它。
答案 1 :(得分: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());
}
答案 2 :(得分:1)
事先要注意的一件事:
地图可能包含2个键,其中第一个是第二个键的修剪版本。通过做你想要的,它会覆盖/从地图中删除其中一个!例如。地图可能包含键"a "
和"a"
,通过修剪键,其中一个键会消失!
HashMap
没有提供任何方法来操纵键而不迭代它们。
你可以&#34;复制&#34;修剪了键的新地图的条目(与@ 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:首先收集然后替换不同的密钥
另一种选择是收集修剪键不同的键,并仅在第一次迭代后更改那些键。该解决方案的优点是不必复制&#34;条目设置迭代它。如果修剪变量不同的键相对较少,那么这可能是最快的解决方案:
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]));