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
中删除这些元素。如何以正确的方式做到这一点。
答案 0 :(得分:3)
如果你知道你的usedElements
列表是按升序排列的,最简单的方法是删除 reverse 顺序中的元素 - 这样“改组”效果不会影响任何后来的操作:
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);
}
答案 1 :(得分: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)。