如何在Hashmap中修剪字符串键

时间:2014-10-17 05:56:47

标签: java hashmap

我的应用会从其他应用中收到Hashmap<String,Object>

有没有办法修剪字符串键而不迭代hashmap导致性能降级becoz Hashmap可能包含大量实际数据条目。

由于

3 个答案:

答案 0 :(得分:2)

您有两种选择:

  • 在添加
  • 之前修剪
  • 遍历MapEntries广告更新所有密钥

在您的示例中,您别无选择,需要迭代这些键。

在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]));