簡體   English   中英

哪種方法更適合查找數組列表中元素的頻率?

[英]Which approach is better for finding the frequency of element in an arraylist?

我創建了一個數組列表並隨機插入了幾個元素。我試圖找到每個元素的出現頻率。我嘗試了兩種方法,兩種方法都可以正常工作。第一種方法是使用JAVA中提供的直接方法,即

  Collection.frequency(collection,"element");

第二種方法是將ArrayList元素放入HashMap並查找頻率

    List<String> elements = new ArrayList<String>();
    elements.add("A");
    elements.add("B");
    elements.add("C");
    elements.add("A");

    Map<String,Integer> count = new HashMap<String,Integer>();

    for(String s : elements)
    {
        if(count.containsKey(s))
        {
            count.put(s,count.get(s)+1);
        }
        else
        {
            count.put(s, 1);
        }
    }

兩種方法都可以正常工作,但是我想知道哪種方法更好。

這取決於您需要多久獲取一次頻率信息-如果它不是Collections::frequency方法中的一種,則該方法很好,否則地圖將更有效。 還要注意,使用Java 8,您可以使用以下命令保存幾行代碼:

Map<String, Long> count = elements.stream().collect(groupingBy(e -> e, counting()));

假定以下進口:
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

好吧,如果您將需要多次使用List中元素的頻率,則使用Map會更有效,因為Collections.frequency每次調用時都會迭代整個列表,而在Map中搜索鍵的過程將保持不變時間。

如果您只需要知道少數元素的頻率(很少),並且您的列表不太大,使用現有方法也不會太糟糕,並且絕對比維護頻率圖容易。

那么您的問題有點模糊,基於什么的更好方法?

正如Eran所指出的那樣,如果您擔心性能,並且將進行多次調用,則HashMap將節省您的時間。 但是,如果不是這樣,那么僅使用頻率應該會更加清楚,並且會使代碼混亂的程度降低,因此我認為通常更喜歡使用前者。 通常,您想使用在復制自己之前已經存在的方法。

如果您只需要遍歷列表一次,則需要頻繁或多次使用元素時,可以使用Map方法。 但是,地圖只是您調用時列表頻率的快照,如果列表發生更改,更新地圖要比重新計算要復雜得多...

最后,如果您使用的是小型列表,則無需擔心性能問題。 我認為這只會影響到列表中有數千個元素,或者每秒調用多次此函數(某些實時服務)。

在任何其他情況下,您幾乎不必考慮哪種方法更好,因為這並不重要。

另一方面,您的問題指出您需要每個元素的頻率...因此,在列表中,您首先需要創建一個Set以獲得唯一的元素,然后應用Collections.frequency()方法。 ..考慮到這一點,我真的會使用Map方法,或者在Java8中使用更酷的流方法...

暫無
暫無

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

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