簡體   English   中英

使用番石榴多集或Collections.frequency()?

[英]Using Guava multisets or Collections.frequency()?

我使用Multiset可以輕松訪問元素的頻率,但是我意識到有Collections#frequency(Collection<?>, Object)對任何集合都可以做到這一點。 那么使用Multiset什么意義呢? 性能是這里的問題嗎?

用於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支持。 有關與遍歷整個集合相比如何更有效的詳細信息,請查看以下答案: Java HashMap如何使用相同的哈希碼處理不同的對象?

番石榴代碼如下

public int count(@Nullable Object element) {
    Count frequency = Maps.safeGet(backingMap, element);
    return (frequency == null) ? 0 : frequency.get();
}

類似地,對於TreeMultiset ,它保持其元素的順序並由AVL樹支持,可以使用O(log(n))步而不是O(n)來獲得count ,其中n是集合的大小。 番石榴代碼如下:

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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM