Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有任何数据丢失的情况下,我们如何交换哈希表键值?_Java - Fatal编程技术网

Java 在没有任何数据丢失的情况下,我们如何交换哈希表键值?

Java 在没有任何数据丢失的情况下,我们如何交换哈希表键值?,java,Java,我经常遇到一个关于Hashtable的问题 如何使用java.util.Hashtable将key转换为value和value转换为key而不丢失任何数据。 Hashtable ht = new Hashtable(); ht.put(1,"One"); ht.put(2,"Two"); ht.put(3,"One"); 我想将键分别转换为“1”、“2”、“1”和值1、2、3 感谢您的宝贵支持。最安全的方法是复制到一个新的哈希表,类似这样的情

我经常遇到一个关于Hashtable的问题

如何使用
java.util.Hashtable将key转换为value和value转换为key而不丢失任何数据。

 Hashtable ht = new Hashtable();

        ht.put(1,"One");
        ht.put(2,"Two");
        ht.put(3,"One");
我想将键分别转换为“1”、“2”、“1”和值1、2、3

感谢您的宝贵支持。

最安全的方法是复制到一个新的
哈希表
,类似这样的情况:

Map copy = new Hashtable();

for (Map.Entry entry : original.entrySet())
{
  copy.put(entry.getValue(), entry.getKey());
}
然后,如果确实需要将键和值恢复到原始状态,只需执行以下操作:

original.clear();
original.putAll(copy);  
试试这个

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

}

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

下面是一个在条目集上迭代的通用实现:

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;
}
publicstatichashtablereverseentries(hashtablein){
Hashtable out=新的Hashtable();
对于(Map.Entry:in.entrySet())
out.put(entry.getValue(),entry.getKey());
返回;
}
迭代条目集是迭代所有条目的最有效方法,因为您可以将键和值放在一起(迭代键意味着您必须查找每个键的条目)。

Google Guava具有以下接口作为实现:

BiMap<Integer,String> map = new HashBiMap<Integer,String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "One");
BiMap map=newhashbimap();
地图放置(1,“一”);
图.put(2,“2”);
地图放置(3,“一”);
但是,这“保留了其值及其键的唯一性”(它由两个
HashMap
s支持),因此在您的特定情况下它不起作用,因为两个值是“一”

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

我想将键分别转换为“1”、“2”、“1”和值1、2、3


这根本不可能。哈希表只为每个键存储一个值。

需要通过编程实现,因此需要迭代loo获取条目并将其存储到temp变量中删除它,然后再次插入。在我看来,示例数据将被键入Int键和字符串值。这将是一个问题。您可能需要一个字符串到字符串的哈希表。您可以创建一个新的
哈希表
,并在上一个表上进行迭代,将key作为value,value作为key。@vorspung通过不指定您实际上得到的
哈希表
的泛型类型来实现键和值的交换。使用Guava是一个选项吗?我想您对OP的示例做了一些修改。在原始帖子中,有ht.put(3,“一”);这将提供与您修改的示例不同的输出-它将产生OP希望避免的数据丢失。感谢@JiriKusa的关注,我已经更正了代码。:)
BiMap<Integer,String> map = new HashBiMap<Integer,String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "One");