Я использовал Multiset
, чтобы иметь свободный доступ к частоте элементов, но я понимаю, что есть Collections#frequency(Collection<?>, Object)
, который делает то же самое для любой коллекции. Какой смысл использовать Multiset
? Здесь проблема производительности?Использование мультимножества Guava или Collections.frequency()?
ответ
гуавы документация Multiset#count() должен сказать:
Заметим, что для Object.equals (java.lang.Object) основе мультимножеством, это дает тот же результат, как Collections.frequency (java.util .Collection, java.lang.Object) (который предположительно будет работать хуже).
Итак, да, я подозреваю, что это проблема.
Я думаю, что Multiset#count
более эффективен, потому что Collections#frequency
выполняет итерацию по всей коллекции. Для объекта o, частота которого вы проверяете, он проходит через все элементы e в коллекции и проверяет (o == null ? e == null : o.equals(e))
.
Для Multiset (который является интерфейсом), точная реализация count
зависит от класса. Например, если это HashMultiset
, то он подкрепляется HashMap
. Подробнее о том, как это более эффективно, чем повторение всей коллекции, см. В этом ответе: How does a Java HashMap handle different objects with the same hash code?.
Guava code выглядит следующим образом
public int count(@Nullable Object element) {
Count frequency = Maps.safeGet(backingMap, element);
return (frequency == null) ? 0 : frequency.get();
}
Аналогично, для TreeMultiset
, который поддерживает упорядоченность ее элементов и опирается на дерево AVL, count
могут быть получены в O (Log (N)) шагов вместо O (n), где n - размер коллекции. Guava code выглядит следующим образом:
public int count(@Nullable Object element) {
try {
@SuppressWarnings("unchecked")
E e = (E) element;
AvlNode<E> root = rootReference.get();
if (!range.contains(e) || root == null) {
return 0;
}
return root.count(comparator(), e);
} catch (ClassCastException e) {
return 0;
} catch (NullPointerException e) {
return 0;
}
}
- 1. Использование Collections.frequency со списком <SomeBeanType>
- 2. Более продвинутая версия Collections.frequency()
- 3. Использование Guava с GWT
- 4. Зачем нужны мультимножества?
- 5. Результаты для заказа из Collections.frequency
- 6. Поиск всех подмножеств мультимножества
- 7. векторная версия медленного мультимножества
- 8. Назначить вектор для мультимножества
- 9. Использование объекта Google Guava Objects.ToStringHelper
- 10. Использование enumset в столяре Guava
- 11. Guava EventBus - FIFO или LIFO?
- 12. Устранение разделов мультимножества с Ruby
- 13. определить пользовательские сравнения для мультимножества
- 14. Атомно получить Multiset запись в ConcurrentHashMultiset (guava)
- 15. Правильное использование guava Predicate на двух типах
- 16. Как указать цвет названия мультимножества
- 17. guava - карта поддерживает функцию guava
- 18. Использование Google Guava для форматирования строк
- 19. Использование Guava для высокопроизводительного поточно-безопасного кэширования
- 20. Использование Spring MVC с Google Guava AtomicLongMap
- 21. Использование Guava для проверки класса генераторов
- 22. Использование Guava Iterables.cycle в круговом списке осущ
- 23. Использование диапазона Guava с пользовательским объектом
- 24. Использование Guava в проекте GWT Maven
- 25. Использование Google Guava для получения списка
- 26. Weirdness Использование Google Guava Collections2.transform
- 27. ImmutableSet из перечисления Guava или Java
- 28. Учебник Google Guava Service или примеры?
- 29. Алгоритм для hash/crc неупорядоченного мультимножества
- 30. Как поля gnuplot работают в режиме мультимножества?
я пропускаю одну простую точку в своем ответе: Если 'Multiset' содержит один элемент, в миллион раз,' Collections.frequency' будет повторять это миллион раз, а 'Multiset' просто находит элемент (применяется ваша Big-O-нотация) и говорит «один миллион». – maaartinus
Для Multiset 'n' обычно относится к числу элементов _distinct_, тогда как, например, «Список», это будет ссылаться на общее количество элементов, отличных или нет. –