[英]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.