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。我需要从列表elements中删除那些在usedElements. 如何以正确的方式做到这一点。

4

2 回答 2

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);
}
于 2013-10-04T16:32:52.627 回答
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)。

于 2013-10-04T16:29:25.827 回答