使用字符查找HashMap中的所有键并替换它

时间:2010-10-04 09:33:14

标签: java key hashmap

我有一个HashMap,现在我需要找到HashMap中的所有键,里面有一个特殊的字母,并用另一个字母替换

5 个答案:

答案 0 :(得分:3)

你可以试试这个:

public void replaceKeysChar(char originalChar, char newChar, Map<String, ?> map) {
    Map<String, Object> tempMap = new HashMap<String, Object>();
    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String key = entry.getKey();
        if(key != null){
            key = key.replace(originalChar, newChar);
        }
        tempMap.put(key, entry.getValue());
    }
    map.clear();
    map.putAll(tempMap);
}

这样您只处理char,并且不会更改实现。 另外,当您迭代时,不要在地图中添加项目(这不是一个坏主意)。

如果您不关心实现,只需返回tempMap并删除clear / putAll部分(它将消耗更少的资源)。

编辑:

在@ locka answer之后我想我应该指明这个方法不能处理碰撞。

如果您的地图包含“toto”和“tata”键并且您执行`replaceKeysChar('a','o',map),则只有“toto”的值和“tata”之间的值之一s值将在地图中,另一个将被忽略。

EDIT bis:

要处理异常冲突(例如@Stephen C),只需用以下内容替换旧的for

    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String key = entry.getKey();
        if(key != null){
            key = key.replace(originalChar, newChar);
        }
        if(tempMap.containsKey(key))
            throw new CollisionException();
        tempMap.put(key, entry.getValue());
    }

答案 1 :(得分:2)

  1. 构建新的hashmap
  2. 复制全部 来自旧的(键,值)对 hashmap,除了你替换 按键中有NEWCHAR的OLDCHAR
  3. 交换 哈希映射结束。

答案 2 :(得分:2)

这是一个通过抛出异常来“处理”碰撞的解决方案。

public void replaceKeysChar(char originalChar, char newChar, Map<String, ?> map) {
    Map<String, Object> tempMap = new HashMap<String, Object>();
    Set<String> tempSet = new HashSet<String>();
    for (Map.Entry<String, ?> entry : map.entrySet()) {
        String originalKey = entry.getKey();
        String newKey = originalKey .replace(originalChar, newChar);
        if (!newKey.equals(originalKey)) {
            if (map.containsKey(newKey) || tempMap.containsKey(newKey)) {
                throw new CollisionException(newKey);
            }
            tempMap.put(newKey, entry.getValue());
            tempSet.add(originalKey());
        }
    }
    map.keySet().removeAll(tempSet);
    map.putAll(tempMap);
}

编辑

修复了以前版本中的错误。

答案 3 :(得分:1)

所以你想改变密钥。如果Hashalgorithm不是奇怪的东西,你将不得不获取所有键值对,从hashmap中删除它们,更改它们并重新插入它们。或者将它们插入新的Hashmap中。

答案 4 :(得分:1)

我认为人们担心由于不变性而无法在原位更改String键,并且String的hashcode与字符串的值相关联。添加/删除密钥可能会起作用,但是您可能会遇到冲突的风险,最终会意外地替换现有的字符串。

解决此问题最明显的方法是使用自定义密钥,例如

public class MyKey {
  static private Random r = new Random();

  private String keyValue; 
  private final int hashCode = r.nextInt();

  @Override
  public int hashCode() {
    return hashCode;
  }

  public void setKeyValue(String keyValue) {
    this.keyValue = keyValue;
  }

  public String getKeyValue() {
    return keyValue;
  }
}

这个键有一个你可以轻松设置/获取的字符串键值和一个只是一个随机数的hashCode。将此密钥添加到哈希映射后,您可以在不添加或删除密钥的情况下就地更改字符串。您所需要做的就是迭代密钥集并在密钥上执行您喜欢的任何处理,所有这些都不会影响哈希码或冒险发生冲突或其他任何事情。