我有一个HashMap,现在我需要找到HashMap中的所有键,里面有一个特殊的字母,并用另一个字母替换
答案 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)
答案 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。将此密钥添加到哈希映射后,您可以在不添加或删除密钥的情况下就地更改字符串。您所需要做的就是迭代密钥集并在密钥上执行您喜欢的任何处理,所有这些都不会影响哈希码或冒险发生冲突或其他任何事情。