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));       
}

と呼ばれるインデックスのリストがありますusedElementselementsに記載されている要素をリストから削除する必要があり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 に答える