Получить HashSet из ключей HashMap? - PullRequest
6 голосов
/ 26 октября 2009

У меня довольно большой (100'000 записей) HashMap. Теперь мне нужен HashSet, содержащий все ключи от этого HashMap. К сожалению, HashMap имеет только метод keySet(), который возвращает Set, но не HashSet.

Каким будет эффективный способ создания такого HashSet с использованием Java?

Ответы [ 5 ]

19 голосов
/ 26 октября 2009

Зачем вам конкретно нужен HashSet?

Любой набор имеет один и тот же интерфейс, поэтому обычно его можно использовать взаимозаменяемо, так как в соответствии с передовыми практиками для всех них необходимо использовать интерфейс набора.


Если вам это действительно нужно, вы можете создать одно из другого. Для общего кода это может быть:

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());
6 голосов
/ 26 октября 2009

Предполагая, что слово «эффективный» является ключевой частью вашего вопроса, и в зависимости от того, что вы хотите сделать с набором, может быть идея создать собственный подкласс 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... */
}

Если вы не знаете, как будет использоваться класс, вам нужно позаботиться о том, чтобы переопределить все соответствующие методы.

4 голосов
/ 26 октября 2009
HashSet myHashSet = new HashSet(myHashMap.keySet());

Не пробовал.

3 голосов
/ 26 октября 2009

Разве вы не можете создать HashSet из существующего Set? Но (что более важно), почему вы беспокоитесь о реализации, возвращенной вам методом keySet()?

2 голосов
/ 26 октября 2009

Set set = new HashSet (map.keySet ());

...