Устранение неполадок в цикле Java - PullRequest
0 голосов
/ 25 августа 2010

Я ищу лучший способ сделать следующее ..

У меня такая петля ...

        while(mcursor.moveToNext()){
        String tname = mcursor.getString(4);
        String tmessage = mcursor.getString(7);
        String tlink = mcursor.getString(5);
        String tsname = mcursor.getString(3);
        Double tlat = mcursor.getDouble(1);
        Double tlng = mcursor.getDouble(2);
    }

для каждого элемента цикла я хочу применить следующее ...

     GeoPoint point = new GeoPoint(tlat,tlng);
   OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
    itemizedoverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedoverlay);

Как бы я это сделал? Ответ, вероятно, очевиден, но я запутываюсь.

Ответы [ 4 ]

2 голосов
/ 25 августа 2010

Java использует ссылки на значения, и в этом ваша проблема.
Как указывает @ st0le, вы можете просто скопировать и вставить свой фрагмент кода прямо в цикл.

Почему мы можем это сделать? Потому что вызов GeoPoint point = new GeoPoint(tlat,tlng) изменит ссылку, хранящуюся в point, а не ее значение. Исходное значение point все еще существует, и ссылка на него была перенесена в конструктор OverlayItem.

while(mcursor.moveToNext()){
    String tname = mcursor.getString(4);
    String tmessage = mcursor.getString(7);
    String tlink = mcursor.getString(5);
    String tsname = mcursor.getString(3);
    Double tlat = mcursor.getDouble(1);
    Double tlng = mcursor.getDouble(2);

    GeoPoint point = new GeoPoint(tlat,tlng);
    OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
    itemizedoverlay.addOverlay(overlayitem);
}
mapOverlays.add(itemizedoverlay);

И вам понадобится последняя строка вне цикла, потому что в противном случае itemizedoverlay будет в mapOverlays несколько раз. Достаточно добавить его только один раз. Либо до входа в цикл, либо после. Добавление элементов в itemizedoverlay изменяет его значение . Предыдущие ссылки на itemizedoverlay останутся прежними, и поэтому изменения будут немедленно видны в mapOverlays.

2 голосов
/ 25 августа 2010

Как то так ...

mcursor = getCursor(); //or whatever
if(mcursor != null && mcursor.moveToFirst())
{
        do
        {
        String tname = mcursor.getString(1);
        String tmessage = mcursor.getString(2);
        String tlink = mcursor.getString(3);
        String tsname = mcursor.getString(6);
        Double tlat = mcursor.getDouble(2);
        Double tlng = mcursor.getDouble(3);

        GeoPoint point = new GeoPoint(tlat,tlng);
        OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);


        }while(mcursor.moveToNext());

}
1 голос
/ 25 августа 2010

Реорганизация ответа @ st0le для группировки данных, которые используются вместе, вместе:

mcursor = getCursor(); //or whatever
if (mcursor != null && mcursor.moveToFirst()) {
    do {
        Double tlat = mcursor.getDouble(5);
        Double tlng = mcursor.getDouble(6);
        GeoPoint point = new GeoPoint(tlat,tlng);

        String tname = mcursor.getString(1);
        String tmessage = mcursor.getString(2);
        OverlayItem overlayitem = new OverlayItem(point, tname, tmessage);
        itemizedoverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedoverlay);
        } while(mcursor.moveToNext());
    }

Что показывает, что мы даже не используем tlink & tsname, поэтому я удалил их.

1 голос
/ 25 августа 2010

Только некоторые исправления к коду в вопросе ...

Double tlat = mcursor.getDouble(2); // should this be 4?
Double tlng = mcursor.getDouble(3); // should this be 5?

// You probably don't want to do this for every loop iteration ...
mapOverlays.add(itemizedoverlay);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...