Java Loop Arraylist и удалить при необходимости - PullRequest
0 голосов
/ 08 марта 2012

У меня есть ArrayList с координатами (long и lat).И я хочу рассчитать расстояние между координатами.

for(Winkel winkel: winkels){
            Projection projection = mv.getProjection();
            ArrayList<Winkel> cluster = new ArrayList<Winkel>();

            winkels.remove(winkel);

            for(Winkel item: winkels){                      
                //GetLocations
                if(Math.sqrt(Math.pow((point.x - point1.x), 2) + Math.pow((point.y - point1.y), 2)) < 100){
                    cluster.add(item);
                    winkels.remove(item);
                }       
            }
        }

РЕДАКТИРОВАТЬ: я редактировал код.Если я получу второй раз за первый раз.Я получаю сообщение об ошибке:

03-08 10:01:27.419: E/AndroidRuntime(10572): 
 java.lang.RuntimeException: Unable to start activity ComponentInfo{be.oww.app/be.oww.app.WinkelsTabActivity}: 
   java.lang.RuntimeException: Unable to start activity ComponentInfo{be.oww.app/be.oww.app.MapsTabActivitiy}: 
     java.util.ConcurrentModificationException

03-08 10:01:27.419: E/AndroidRuntime(10572):    
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1821)

...

Ответы [ 5 ]

2 голосов
/ 08 марта 2012

Вы можете получить второй итератор для второго цикла while:

 Iterator<Winkel> iItems = winkels.iterator();
 while(iItems.hasNext()){
        Winkel item = iItems.next();

С вашим текущим кодом, winkel устанавливается для первого элемента коллекции, затем внутренний цикл выполняется от второго до последнего. Это, вероятно, не , что вы хотите.

Кстати: - вы можете сделать то же самое с циклом:

for (Winkel winkel:winkels) {
  Projection projection = mv.getProjection();
  ArrayList<Winkel> cluster = new ArrayList<Winkel>();
  for(Winkel item:winkels){
     Double itemLat = Double.parseDouble(item.getCoordinaten().split(",")[0]) * 1E6;
     // ...
  }
  if(cluster.size()==0){
    // ...
}            
1 голос
/ 08 марта 2012

Я не знаю, какую логику вы используете, но я бы сделал цикл следующим образом:

List<Winkel> toRemove = new ArrayList<Winkel>();
for (int i = 0; i < winkels.size(); i++) {
    Winkel winkel = winkels[i];
    // you don't have to compare a point with itself
    for (int j = i+1; j < winkels.size(); j++) {
        Winkel item = winkels[j];
        // do item stuff here
        if (distance < 100) {
            toRemove.add(winkel);
            break;
        }
    }
    // do winkel stuff here
}
winkels.removeAll(toRemove); // items are removed after the loop

PS: я не считаю хорошей идеей удалять объекты из списка во время итерации.

1 голос
/ 08 марта 2012

Вы не хотите, чтобы на одном итераторе были вложенные циклы.

Похоже, вы хотите сравнить каждый элемент коллекции с любым другим элементом коллекции.В этом случае ваш внешний цикл должен использовать итератор на winkels, как в настоящее время.И в теле внешнего цикла вы должны получить другой итератор на winkels и перебрать второй итератор во внутреннем цикле.

(ах ... уже кто-то другойопубликовал тот же ответ)

Будет проще увидеть структуру, если вы воспользуетесь расширенным циклом for:

for (Winkel winkel : winkels) {

    Projection projection = mv.getProjection();
    ArrayList<Winkel> cluster = new ArrayList<Winkel>();

    for (Winkel otherWinkel : winkels) {
        // do what you need to compare the two Winkels
        // this will be executed N*N times where N is collection size
    }
}

(правка: мне кажется, я здесь клонирую чужие мысли)

1 голос
/ 08 марта 2012

На самом деле next() не ничего не удаляет .Функция remove() удаляет.next() просто дает вам следующий элемент.

Если вы не хотите переходить к следующему элементу, не вызывайте next(), но помните предыдущее значение в переменной.

0 голосов
/ 08 марта 2012

Единственный безопасный способ удаления элементов из Коллекции во время цикла - через Итератор, иначе у вас возникнут проблемы.Итак, попробуйте это:

Iterator<Winkel> iterator = winkels.iterator();
while(iterator.hasNext()) {
    Winkel winkel = iterator.next();
    // do something with winkel
    if (condition) {
        iterator.remove(); // removes current winkel from the collection
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...