我经常遇到关于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。
感谢您的宝贵支持。
答案 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与BiMap的HashBiMap接口作为实现:
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只为每个密钥存储一个值。