从HashMap的键中获取HashSet?

时间:2009-10-26 16:36:56

标签: java hashmap hashset

我有一个非常大的(100'000s条目)HashMap。现在,我需要HashSet包含此HashMap中的所有密钥。很遗憾,HashMap只有一个keySet()方法,该方法返回Set而不是HashSet

使用Java生成这样的HashSet的有效方法是什么?

5 个答案:

答案 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());