我正在尝试为修改 put 函数的 HashMap 创建一个扩展。目标是让 put 函数不允许重复值。因此,如果有人试图在键/值 (A,a) 已经在映射中时插入键/值 (B,a),那么它将用 (B,a) 替换键/值 (A,a) ) 而不是创建新的键/值对。
我遇到的问题是我不知道如何在不迭代表的情况下找到与值对应的键(我不能这样做,因为表是一个私有(private)变量,我无法访问它从我的功能扩展中)。
我还尝试使用 keySet() 检索键集,目的是在每个键上运行 get() 操作,但是 set 变量真的让我感到困惑,我不确定如何正确地迭代和对单个元素运行 get() 操作。
编辑: 这是我到目前为止所拥有的: 导入 java.util.*;
公共(public)类 UniqueHashMap 扩展 HashMap {
public V put(K key, V value) {
boolean contains = containsValue(value);
if (contains == true)
// INSERT CODE HERE
else
return super.put(key, value);
}
在 if 语句中,我想做的是能够: 1)找到“value”对应的key。 2) 删除 key 。 3) 插入新的键/值对。
我遇到问题的部分是 1) 因为我见过的大多数解决方案都需要访问映射(我不知道如何获取,因为它是 HashMap 中的私有(private)变量)。我可以使用 keySet() 访问键,但我不知道如何对各个键迭代运行 get() 操作,因为我对 set 变量感到困惑。
最佳答案
一种方法:
import java.util.HashMap;
import java.util.Map.Entry;
public class MyHashMap<K, V> {
private HashMap<K, V> map;
void put(K key, V value) {
if (map.containsValue(value)) {
K keyToRemove = findKeyByValue(value);
map.remove(keyToRemove);
map.put(key, value);
} else {
map.put(key, value);
}
}
private K findKeyByValue(V val) {
for (Entry<K, V> e : map.entrySet()) {
if (val == e.getValue())
return e.getKey();
}
return null;
}
}
但请注意,这样您将失去 HashMap 的 put
方法的恒定复杂性。
编辑:包括一个可编译类
关于java - 如何在不迭代表的情况下找到与 HashMap 中的值对应的键(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208281/