2013-10-04 258 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

相关问题