java - 如何在不迭代表的情况下找到与 HashMap 中的值对应的键(Java)

标签 java loops hashmap

我正在尝试为修改 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/

相关文章:

java.nio.charset.IllegalCharsetNameException : 'ISO-8859-1'

java - Java 中按原语或装箱类进行 foreach 循环

javascript - 使用 javascript 迭代子对象并获取所有值

java - 对Hashmap值进行排序compareTo方法

具有多个键的 Java WeakHashMap?

java - HashMap.tableSizeFor(...)。这段代码如何舍入到下一个 2 的幂?

java - 信件被接受为双份

java - 在编译过程中的词法分析阶段,javadoc 注释是否会被消除/删除?它是否包含在您的最终 .class 文件中?

python - 打印两个列表中都不存在的项目

在循环中不断检查共享内存是否发生变化