получить количество экземпляров элемента в мультимножестве guava без итерации

#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: Я отредактировал свой ответ, чтобы уменьшить путаницу. Спасибо автору 🙂