我有一个非常大的(100'000s条目)HashMap
。现在,我需要HashSet
包含此HashMap
中的所有密钥。很遗憾,HashMap
只有一个keySet()
方法,该方法返回Set
而不是HashSet
。
使用Java生成这样的HashSet
的有效方法是什么?
答案 0 :(得分:19)
为什么特别需要HashSet?
任何Set具有相同的接口,因此通常可以互换使用,因为良好实践要求您为所有这些使用Set接口。
如果你真的需要,你可以从另一个创建一个。对于通用代码,它可以是:
Map<B, V> map = ...;
HashSet<B> set = new HashSet<B>(map.keySet());
答案 1 :(得分:6)
假设“有效”这个词是你问题的关键部分,并且根据你想要对集合做什么,可能想到创建你自己的HashSet子类,忽略HashSet实现并呈现一个视图相反,在现有地图上。
作为部分实现的示例,它可能类似于:
public class MapBackedHashSet extends HashSet
{
private HashMap theMap;
public MapBackedHashSet(HashMap theMap)
{
this.theMap = theMap;
}
@Override
public boolean contains(Object o)
{
return theMap.containsKey(o);
}
/* etc... */
}
如果您不知道如何使用该课程,您需要注意覆盖所有相关方法。
答案 2 :(得分:4)
HashSet myHashSet = new HashSet(myHashMap.keySet());
没试过。
答案 3 :(得分:3)
您是否可以从现有HashSet
创建Set
?但是(更重要的是)为什么你担心从keySet()
方法返回给你的实现?
答案 4 :(得分:2)
设置set = new HashSet(map.keySet());