Java循环故障排除

Java循环故障排除,java,android,sqlite,loops,Java,Android,Sqlite,Loops,我正在寻找做以下事情的最佳方法 我有一个这样的循环 while(mcursor.moveToNext()){ String tname = mcursor.getString(4); String tmessage = mcursor.getString(7); String tlink = mcursor.getString(5); String tsname = mcursor.getString(3);

我正在寻找做以下事情的最佳方法

我有一个这样的循环

        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);
我该怎么做?答案可能很明显,但我自己也很困惑。

类似这样的事情

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

}
像这样的

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

}

只是对问题中代码的一些更正

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

只是对问题中代码的一些更正

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

重新组织@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,所以我删除了它们。

重新组织@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,所以我删除了它们。

java使用对值的引用,这就是问题所在。
正如@st0le所指出的,您可以直接在循环中复制粘贴代码

为什么我们可以这样做?因为调用
GeoPoint point=new GeoPoint(tlat,tlng)
将更改存储在
point
中的引用,而不是其值。
的原始值仍然存在,并且对它的引用已过
覆盖项
构造函数

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
中可见,java使用对值的引用,这就是问题所在。
正如@st0le所指出的,您可以直接在循环中复制粘贴代码

为什么我们可以这样做?因为调用
GeoPoint point=new GeoPoint(tlat,tlng)
将更改存储在
point
中的引用,而不是其值。
的原始值仍然存在,并且对它的引用已过
覆盖项
构造函数

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

中可以立即看到更改,但是不断声明相同的变量(例如
覆盖项
不会导致之前的变量被覆盖吗,这些变量只是该循环迭代作用域的局部变量。@Meowmix-不,它们不会。
new
操作每次创建一个新对象。(@Mauro-scoping不相关。如果
覆盖项
在循环之外声明,则情况相同。)@Meowmix:不相关。因为在每次迭代中,您都在创建新对象。只是引用名称与旧名称相同,但对象本身与旧名称不同。但是不断声明相同的变量(例如
point
overlayitem
是否会导致之前的变量被覆盖?不应该执行Meowmix,这些变量仅在该循环迭代范围内。@Meowmix-不,它们不会。
new
操作每次创建一个新对象。(@Mauro-scoping不相关。如果
覆盖项
在循环之外声明,则情况相同。)@Meowmix:不相关。因为在每次迭代中,您都在创建新对象。只是引用名称和旧名称相同,但对象本身不同于旧名称。mcursor可能必须按该顺序调用这些方法,所以不能重新排列。好意,可惜。卡尔的回答指出的是,这些字段不需要声明。因此,请尝试调用
String tname=mcursor.getString(1)
以获取已使用的值,并调用
mcursor.getString(6)
(不带赋值)以获取未使用的值。很抱歉,@neXus,但这不可能是正确的-光标位于特定的记录位置,并且可以按任何顺序获取记录的字段。在调用
moveToNext()
之前,光标或其对数据的访问没有任何更改。我一定是把它与其他东西混淆了。可能是从带有InputStream的文件中读取。我从没用过游标,但我想我记得。谢谢mcursor可能必须按照这个顺序调用这些方法,所以重新排列不是一个选项。好意,可惜。卡尔的回答指出的是,这些字段不需要声明。因此,请尝试调用
String tname=mcursor.getString(1)
以获取已使用的值,并调用
mcursor.getString(6)
(不带赋值)以获取未使用的值。很抱歉,@neXus,但这不可能是正确的-光标位于特定的记录位置,并且可以按任何顺序获取记录的字段。在调用
moveToNext()
之前,光标或其对数据的访问没有任何更改。我一定是把它与其他东西混淆了。可能是从带有InputStream的文件中读取。我从没用过游标,但我想我记得。谢谢