удаление специального элемента из arrayList - PullRequest
1 голос
/ 22 ноября 2010

Привет Я написал эту часть кода. До цикла for у меня есть этот массив:

[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--;

        }
    }

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

Ответы [ 3 ]

6 голосов
/ 22 ноября 2010

Я рекомендую вам получить 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()), чтобы получить эти очки сбольший угол, чем у оси.

5 голосов
/ 22 ноября 2010

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

for (int i  = list.size() - 1; i >= 0; i--) {
    if (list.get(i).getAngle() > pivot.getAngle() ) {
        list.remove(i);
    }
}
4 голосов
/ 22 ноября 2010

Когда вы удаляете элемент, вам также следует понизить значение индекса (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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...