#java #guava #multiset
#java #guava #мультимножество
Вопрос:
У меня есть мультимножество в guava, и я хотел бы получить количество экземпляров данного элемента без итерации по этому мультимножеству (я не хочу повторять, потому что предполагаю, что итерация занимает довольно много времени, поскольку она просматривает всю коллекцию).
Чтобы сделать это, я думал сначала использовать метод entryset() multiset, чтобы получить набор с единичными экземплярами и их соответствующим количеством. Затем преобразуйте этот набор в hashmap (где ключи — это элементы моего набора, а значения — их количество экземпляров). Потому что тогда я могу использовать методы hashmap для прямого извлечения значения из его ключа — готово! Но это имеет смысл, только если я могу быстро преобразовать набор в hashmap (без повторения всех элементов): возможно ли это?
(как я уже сказал, я ожидаю, что этот вопрос будет ошибочным по нескольким причинам, я был бы рад, если бы вы могли пролить свет на концептуальные ошибки, которые я, вероятно, допускаю здесь. Спасибо!)
Ответ №1:
Просто вызовите count(element)
свой мультимножество — вуаля!
Ответ №2:
Возможно, вы знаете, что в Guava Multiset
это интерфейс, а не класс.
Если вы просто хотите узнать повторяющийся номер элемента, вызовите Multiset.count(Object element)
.
Пожалуйста, забудьте мое следующее утверждение:
Тогда, если вы используете популярную реализацию HashMultiset
, под сценой уже есть HashMap<E, AtomicInteger>
рабочая. То есть, когда HashMultiset
итерация выполняется, также выполняется итерация HashMap. Нет необходимости преобразовывать в другую хэш-карту.
Комментарии:
1.Первое предложение — отвлекающий маневр.
Multiset
Интерфейс определяетcount
метод (который является правильным для использования). Нет необходимости использоватьHashMultiset.count
специально.2. @ChrisJester-Young: Да,
HashMultiset.count
переопределяетMultiset.count
.3. Конечно. Но это не меняет того факта, что вы все равно должны просто использовать
Multiset
интерфейс, а неHashMultiset
явно. (т.Е. ,Multiset multiset = HashMultiset.create();
, нетHashMultiset multiset = HashMultiset.create();
.) Вы все равно будете работать в терминахMultiset
интерфейса; только фабричный метод должен заботиться о том, чтобы он былHashMultiset
за кулисами.4. Да, этот ответ так странно объяснен, что я опубликовал новый ответ только для того, чтобы, знаете, дать ответ напрямую.
5. @Kevin Bourrillion: Я отредактировал свой ответ, чтобы уменьшить путаницу. Спасибо автору 🙂