2010-11-23 64 views
18

問題是從HashMap.values()集合創建ArrayList需要多少成本?或者單獨創建值集合? 假設Map.size()> 100k。 對象也可以一直保存在ArrayList(而不是HashMap)中,這對其他部分(元素的修改,通過鍵很容易)有影響。 ArrayList用於迭代每個第n個元素。 (這就是爲什麼值集合不能直接使用)。迭代過程中不做任何修改。性能:從HashMap.values()創建ArrayList()

+0

問題不清楚,我不明白。 – Emil 2010-11-23 10:32:40

+2

當你談論「成本」時,你的意思是時間還是記憶? – Ralph 2010-11-23 11:24:39

回答

2

您可以使用Iterator跳過元素 - 多次呼叫next()

創建任何集合的列表具有線性複雜性。

0

你可以創建自己的HashMap,直接保存Arraylist值集合(我不相信HashMap是免費的,它的數據結構是不同的)。但是這需要你的一些額外的編碼。

7

HashMap內部存儲集合values中的值。看看AbstractMapsource code,它的父母HashMap

因此HashMap.values()直接返回Collection。沒有計算或數據複製完成。它儘可能快。

剛剛得到的值,然後循環做:

int n = 5; // every 5th element 
Object[] values = hashMap.values().toArray(); 
int size = values.length; 
for (int i = 0; i < size; i += n){ 
    values[i]; 
    // do something 
) 
34

HashMap.values()不返回值的ArrayListValues集合。

來源:

public Collection<V> values() { 
     Collection<V> vs = values; 
     return (vs != null ? vs : (values = new Values())); 
    } 

ValuesAbstractCollection。值的原因就是引用HashMap的迭代器。

你的問題:

問題是,要花多少錢 創建從 HashMap.values()收集一個ArrayList?

這是一個線性複雜(如Bozho所述),因爲

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values()); 

ArrayList中,valuesList調用集合hashMaptoArray()方法,其基本上不從0..N(大小)元件的for環在採集。

希望這會有所幫助。

3

要詳細說明@ Bozho的解決方案,你可以做。

int count = 0; 
for(Value value: map.values()) 
    if(count++ % 5 == 0) 
    // do something.