Получить HashSet из ключей HashMap?
Вопрос
У меня довольно большая (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 ());