2010-11-22 3 views
1

Привет Я написал эту часть кода .before для цикла у меня есть этот ArrayList:удаление специальный элемент из ArrayList

[X :49.0 Y: 113.0 , angle :0.0, X :141.0 Y: 106.0 , angle :0.0, X :110.0 Y: 185.0 , angle: 1.0768211289482128, X :99.0 Y: 139.0 , angle: 1.9961041242180873, X :103.0 Y: 126.0 , angle : 2.4208694638343324] , которые показывают "x" and "y" and "angle" некоторых точек. но в цикл я хочу, чтобы удалить те элементы, которые более

X :110.0 Y: 185.0 , angle: 1.0768211289482128

НО распечатать этот массив для меня:

[X :49.0 Y: 113.0angle0.0, X :141.0 Y: 106.0 , angle:0.0, X :110.0 Y: 185.0 , angle: 1.0768211289482128, X :103.0 Y: 126.0 , angle: 2.4208694638343324] , который неправильно

int size = list .size(); 
    for (int i=0;i<size;i++) { 
     if (list.get(i).getAngle() > pivot.getAngle()) { 
      list.remove(i); 
      size--; 

     } 
    } 

пожалуйста помогите мне спасибо

ответ

5

Wh enever удалить элемент сдвигает показатели следующих элементов вниз 1. Самым простым способом исправить это пойти в обратном направлении:

for (int i = list.size() - 1; i >= 0; i--) { 
    if (list.get(i).getAngle() > pivot.getAngle()) { 
     list.remove(i); 
    } 
} 
+1

Приятно видеть, что мы оба имели тот же подход :) –

+0

@Jon: Да. Я также вижу, что мы оба рефлексивно использовали стиль Google при форматировании строки «для» ... :-) –

+0

Да, хотя с 4 отступами пространства ... –

4

При удалении элемента, вы должны также снизить значение индекса (i), как в противном случае он пропустит следующее значение - потому что значения будут сдвинуты. Например, представьте, что вы изначально имели значения { a, b, c, d, e }. На итерации, где i==2, вы можете посмотреть на c. Если после этого вы удалите c, вы останетесь с { a, b, d, e } ... когда i будет увеличен до 3 в итерационной части инструкции for, то есть list.get(i) вернет e - так что вы никогда не будете смотреть на d.

Вы можете это исправить, добавив i--; заявление внутри if блока ... но более простой подход к работе в обратном направлении от конца:

for (int i = list.size() - 1; i >= 0; i--) { 
    if (list.get(i).getAngle() > pivot.getAngle()) { 
     list.remove(i); 
    } 
} 

В качестве альтернативы, вы можете рассмотреть вопрос о создании новый список, который содержит только элементы, которые вы сделать хочет сохранить:

List<Foo> validValues = new ArrayList<Foo>(); 
for (Foo foo : list) { 
    if (foo.getAngle() <= pivot.getAngle()) { 
     validValues.add(foo); 
    } 
} 
+0

Большое спасибо, я понял! :) – user472221

6

Я рекомендую вам, чтобы получить Iterator из list и использовать iter.hasNext(), iter.next() и iter.remove(), как это:

Iterator<Point> iter = list.iterator(); 
while (iter.hasNext()) 
    if (iter.next().getAngle() > pivot.getAngle()) 
     iter.remove(); 

Другим вариантом было бы поместить их в SortedMap, пусть углы представляют собой ключи, и использовать tailMap(pivot.getAngle()), чтобы получить эти очки с большим углом, чем ось поворота.

+2

Этот ответ намного приятнее остальных (+1) –

Смежные вопросы