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

时间:2014-03-05 20:17:52

标签: java loops hashmap

我正在尝试创建一个修改put函数的HashMap扩展。目标是让put函数不允许重复值。因此,如果有人试图在键/值(A,a)已经在地图中时插入键/值(B,a),那么它将用(B,a)替换键/值(A,a)而不是创建一个新的键/值对。

我遇到的问题是我不知道如何在不迭代表的情况下找到与值对应的键(由于表是私有变量而我无法访问它,因此我无法做到这一点从我的功能扩展中)。

我还试图用keySet()检索一组键,目的是对每一个键运行get()操作,但set变量真的让我感到困惑,我不知道如何正确迭代和对各个元素运行get()操作。

编辑: 这是我到目前为止: import java.util。*;

公共类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)找到与“值”对应的键。 2)删除密钥。 3)插入新的键/值对。

我遇到问题的部分是1)因为我看到的大多数解决方案都需要访问地图(我不知道如何获取,因为它是HashMap中的私有变量)。我可以使用keySet()访问密钥,但我不知道如何在各个键上迭代运行get()操作,因为我对set变量感到困惑。

4 个答案:

答案 0 :(得分:1)

一种方法:

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方法的复杂性。

编辑:包括可编辑的课程

答案 1 :(得分:0)

你可以扩展HashMap(可能更好地自己实现Map并使用HashMap实现它,只要它们添加更多的add方法),并覆盖add方法和每个方法:

If HashMap contains the key already
    grab the instance that the key refers to and remove it from the map, and re-put that instance into the map with the supplied key instead of the old key
Else
    Just put with the supplied key and value.

使用内部HashSet跟踪上次与键关联的值,这样就可以对上面的If部分执行O(1)删除。

答案 2 :(得分:0)

我认为您要找的是Map的{​​{3}}方法。这允许您一起迭代键和对应的值对:

public void put(K key, V val) {
  Iterator<Map.Entry<K, V>> entries = entrySet().iterator();
  while (entries.hasNext()) {
    if (entries.next().getValue().equals(val)) {
      entries.remove();
      break;
    }
  }
  super.put(key, val);
}

答案 3 :(得分:0)

使用Google GuavaBiMap。它旨在处理这种情况,因为它是一个双向地图。

您可以致电Object key = myBiMap.inverse().get( myValue );