Вопрос

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

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

Это было полезно?

Решение

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

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

<Ч>

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

    Map<B, V> map = ...;
    HashSet<B> set = new HashSet<B>(map.keySet());

Другие советы

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

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

HashSet myHashSet = new HashSet(myHashMap.keySet());

Не пробовал.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top