2013-03-15 59 views
2

所以我试图创建一个名为UniqueHashMap的HashMap类的扩展,它具有HashMap类的所有属性,但不是不能要重复键,值不能重复。如果值是重复的,关键被替换,如:创建一个java.util.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)

我在做扩展错误吗?还是我缺少一些进口?

+0

为什么不直接使用你的值作为你的密钥,反之亦然,使用常规的HashMap? – adamdunson 2013-03-15 18:22:12

回答

3

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

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

+0

我无法使用BiMap,必须创建UniqueHashMap类扩展。我被允许有重复的值,但没有键 – 2013-03-15 18:01:54

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); 
} 
0

如果你想使用的HashMap的一般形式,你应该做的继承是这样的:

public class UniqueHashMap<K, V> extends HashMap<K, V> { 
    .... 
} 
+0

好吧,现在我有了这个,K和V已经解决了。然而散列(主要的Set构造函数)没有。任何想法我可以在扩展中改变? – 2013-03-15 18:10:05

+0

但你在哪里声明变量'hash'? – niculare 2013-03-15 18:14:52

+0

我没有,我希望它只是从HashMap类(它显然没有),但我不知道如何声明它,我觉得它可能应该是一个集。 – 2013-03-15 18:18:57

0

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