7

我有一个相当大的(100'000s 条目)HashMap。现在,我需要一个HashSet包含来自 this 的所有键HashMap。不幸的是,HashMap只有一个keySet()返回 aSet而不是 a的方法HashSet

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

4

5 回答 5

20

为什么你特别需要一个 HashSet?

任何 Set 都具有相同的接口,因此通常可以互换使用,因为良好实践要求您对所有 Set 都使用 Set 接口。


如果你真的需要,你可以从另一个创建一个。对于通用代码,它可能是:

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());
于 2009-10-26T16:41:05.510 回答
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... */
}

如果您不知道如何使用该类,则需要注意覆盖所有相关方法。

于 2009-10-26T17:05:36.880 回答
4
HashSet myHashSet = new HashSet(myHashMap.keySet());

没试过。

于 2009-10-26T16:40:22.267 回答
3

你不能HashSet从现有的创建Set?但是(更重要的是)你为什么担心从keySet()方法返回给你的实现?

于 2009-10-26T16:40:28.520 回答
2

设置 set=new HashSet(map.keySet());

于 2009-10-26T16:40:52.593 回答