没有任何数据丢失,我们如何交换哈希表键值?

时间:2013-12-23 11:18:54

标签: java

我经常遇到关于Hashtable的问题。

如何使用java.util.Hashtable.

将密钥作为值转换为密钥而不会丢失任何数据
 Hashtable ht = new Hashtable();

        ht.put(1,"One");
        ht.put(2,"Two");
        ht.put(3,"One");

我想将密钥转换为“One”,“Two”,“One”,值分别为1,2,3。

感谢您的宝贵支持。

5 个答案:

答案 0 :(得分:0)

最安全的方法(我的意思是避免这样的情况:已经有一个键等于Hashtable中的一个值,如示例中值"one" )是复制到新的Hashtable,如下所示:

Map copy = new Hashtable();

for (Map.Entry entry : original.entrySet())
{
  copy.put(entry.getValue(), entry.getKey());
}

然后,如果您真的需要将键和值重新放回原文中,请执行以下操作:

original.clear();
original.putAll(copy);  

答案 1 :(得分:0)

试试这个

public static void main(String[] args) {
    Hashtable<Object, Object> ht1 = new Hashtable<Object, Object>();

    ht1.put(1, "One");
    ht1.put(2, "Two");
    ht1.put(3, "One");

    Hashtable<Object, Object> ht2 = new Hashtable<Object, Object>();
    for (Object key : ht1.keySet()) 
    {
        Object value = ht1.get(key);    
        ht2.put(new Temp(value.toString()), key);
    }    
    ht1.clear();    
    ht1.putAll(ht2);

}

修改

class Temp
{
    String str1;
    public Temp(String str1) {
    this.str1 = str1;
    }
}

通过提供作为Temp类对象的引用类型,可以避免数据丢失。

答案 2 :(得分:0)

这是一个遍历条目集的通用实现:

public static <K, V> Hashtable<V, K> reverseEntries(Hashtable<K, V> in) {
    Hashtable<V, K> out = new Hashtable<V, K>();
    for (Map.Entry<K, V> entry : in.entrySet())
        out.put(entry.getValue(), entry.getKey());
    return out;
}

迭代条目集是迭代所有条目的最有效方法,因为你一起获得了键和值(迭代键意味着你必须查找每个键的条目)。

答案 3 :(得分:0)

Google Guava与BiMapHashBiMap接口作为实现:

BiMap<Integer,String> map = new HashBiMap<Integer,String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "One");

然而,这“保留了其值及其键值的唯一性”(它由两个HashMap s支持),因此在您的特定情况下它不起作用,因为两个值是“一”。

如果您需要此功能,那么使用Guava可能是接近它的最佳方式,但如果您想了解如何实现它,那么查看HashBiMap的源代码也可能会有所帮助。

答案 4 :(得分:0)

  

我想将密钥转换为“One”,“Two”,“One”,值分别为1,2,3

这根本不可能。 Hashtable只为每个密钥存储一个值。