2

所以我试图创建一个名为 UniqueHashMap 的 HashMap 类的扩展,它具有 HashMap 类的所有属性,但是不能重复键,不能重复值。如果重复值,则替换键,例如:

Apple->Green

我试着put("Pear", "Green")

我们不会有:Pear->Green

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


public class UniqueHashMap extends HashMap {

    public UniqueHashMap() {
    }

    public UniqueHashMap(int arg0) {
        super(arg0);
    } 

    public UniqueHashMap(Map arg0) {
        super(arg0);
    }

    public UniqueHashMap(int arg0, float arg1) {
        super(arg0, arg1);
    }

    public V put(K k, V v){
        Set entrySet = (Set) hash.entrySet(); //Store entry of HashMap in a set

        Iterator entryIterator = entrySet.iterator(); //Create iterator for the set

        if(hash.containsValue(v))
        {           
            while(entryIterator.hasNext())
            {
                Map.Entry mapEntry = (Map.Entry) entryIterator.next();

                String key = (String) mapEntry.getKey();
                String value = (String) mapEntry.getValue();

                System.out.println("Key is = " + key + " and Value is = " + value);
                System.out.println();

                if (value.equals(v))
                {
                    hash.remove(key);
                    hash.put(v, value);
                    break;
                }
            }

            System.out.println(hash);
        }
    }

如您所见,我拥有超类的所有构造函数,但是它不会解析它应该从HashMap类中继承的值(K、V、Hash、Map)

我做错扩展了吗?还是我错过了一些进口?

4

4 回答 4

3

如果这不是一项学术任务,而您只需要一个具有唯一键和值的集合 - 使用 BiMap。

您可以在 Google Guava ( BiMap ) 和 Apache Commons ( BidiMap ) 中找到它。

于 2013-03-15T18:00:12.683 回答
1

由于您正在反向执行您的唯一关系,因此您UniqueHashMap应该类似地委托给它的父类。

 public V put(K k, V v) {
     // reverse the order you put, and what you're keying off of.
     super.put(v, k);
 }
于 2013-03-15T18:01:04.410 回答
0

如果你想使用 的通用形式HashMap,你应该这样继承:

public class UniqueHashMap<K, V> extends HashMap<K, V> {
    ....
}
于 2013-03-15T18:01:07.723 回答
0

在另一个方向创建一个 HashMap,其中它的键是第一个映射值。我认为这就是 Apache Commons 的 BiMap 所做的。

于 2013-03-15T18:01:23.897 回答