2013-10-04 177 views
1
List<Double> elements = new ArrayList<Double>(); 
List<Integer> usedElements = new ArrayList<Integer>(); 

for (int i=0; i<usedElements.size(); i++) 
{ 
    elements.remove(usedElements.get(i));  
} 

有一個索引列表usedElements。我需要刪除usedElements中提到的列表elements中的那些元素。如何以正確的方式做到這一點。從列表中刪除那些索引在另一個列表中的元素

+0

'usedElements'列表的順序是什麼?這很重要......因爲在你刪除了第一個元素之後,其他的東西都會洗牌...... –

+0

就是這樣。所以我發佈了這個話題。例如。 usedElements = <0, 2, 1, 4> –

回答

2

您可能會發現更容易地創建,而不是試圖修改代替原來列表中的新名單:

Set<Integer> used = new HashSet<>(usedElements); // maybe use a set in the 
                // first place? 

List<Integer> newElements = 
         new ArrayList<>(elements.size() - used.size()); 

for (int i = 0; i < elements.size(); i++) { 
    if (!used.contains(i)) 
     newElements.add(elements.get(i)); 
} 

elements = newElements; 

這整個過程是O(n)。

+0

爲什麼設置,而不是列表? –

+0

@KlausosKlausos套件比列表具有更快的封閉測試(恆定時間與線性時間)。此外,一套更有意義。你有一個無序的整數集合。 – arshajii

3

如果你知道你usedElements列表是按升序排列,最簡單的方法是刪除元素相反順序 - 這樣的「洗牌了」效果不會影響任何後續操作的:

List<Double> elements = ...; 
List<Integer> usedElements = ...; 

for (int i = usedElements.size() - 1; i >= 0; i--) { 
    elements.remove(usedElements.get(i));  
} 

如果usedElements不是當前排序,這將是最好的只是排序它第一次。如果usedElements不是當前排序你需要保持其目前的訂單還有另外一個原因,則先創建一個副本,那種:

List<Double> elements = ...; 
List<Integer> usedElements = ...; 
List<Integer> sortedUsedElements = new ArrayList<Integer>(usedElements); 
Collections.sort(sortedUsedElements); 

for (int i = sortedUsedElements.size() - 1; i >= 0; i--) { 
    elements.remove(sortedUsedElements.get(i));  
} 

甚至逆向排序複製和使用增強for循環:

List<Double> elements = ...; 
List<Integer> usedElements = ...; 
List<Integer> sortedUsedElements = new ArrayList<Integer>(usedElements); 
Collections.sort(sortedUsedElements, Collections.<Integer>reverseOrder()); 

for (Integer index : sortedUsedElements) { 
    elements.remove(index); 
} 
+2

'int i = usedElements.size();'會是IndexOutOfBoundsException。 – Masudul

+0

這似乎不必要的複雜,不僅僅是創建沒有指定元素的新列表會更快更簡單嗎? – arshajii

+0

JonSkeet犯了一個錯誤,我沒有!我會開心的! (雖然他仍然51秒更快,雖然有最初的想法,但我必須改進...) – ppeterka

相關問題