所以,这是我的课:

public class SegmentMaker {

    public ArrayList<Segment> makeSegments(CustomNodes cn, Trip myTrip) {

        ArrayList<Segment> segments = new ArrayList<Segment>();
        ArrayList<Integer>segmentNodes = new ArrayList<Integer>();

        int count = 0;

        for (int i=0; i < myTrip.getTripList().size(); i++){
            Log.d(TAG, "checking " + cn.getOsmID(myTrip.getTripItem(i)));

            if (i==0) {
                segmentNodes.add(myTrip.getTripItem(i));
            }

            else if (i==myTrip.getTripList().size()-2) {
                segmentNodes.add(myTrip.getTripItem(i));
            }

            else if (i==myTrip.getTripList().size()-1) {
                segmentNodes.add(myTrip.getTripItem(i));
                Segment segment = new Segment();
                segment.setId(count);
                segment.setNodeIds(segmentNodes);

                Log.d(TAG, "in SM segment " + segment.getId() + " nodes: " + segment.getNodeIds().toString());
                segmentNodes.clear();
                count++;
                segments.add(segment);
                Log.d(TAG, "in SM segment " + segment.getId() + " nodes: " );
                for (int x=0; x<segment.getNodeIds().size(); x++) {
                    Log.d(TAG, "   " + segment.getNodeIds().get(x));
                }
                break;
            }

            else if ((getAngle(myTrip.getTripItem(i), myTrip.getTripItem(i+1), myTrip.getTripItem(i+2),cn) < 25)  &&
                    (getAngle(myTrip.getTripItem(i), myTrip.getTripItem(i+1), myTrip.getTripItem(i+2),cn) > -25))
            {
                segmentNodes.add(myTrip.getTripItem(i));
            }

            else {
                segmentNodes.add(myTrip.getTripItem(i));
                Segment segment = new Segment();
                segment.setId(count);
                segment.setNodeIds(segmentNodes);

                Log.d(ONE, "in SM segment " + segment.getId() + " nodes: " + segment.getNodeIds().toString());

                segments.add(segment);
                segmentNodes.clear();
                count++;
            }
        }

        Log.d(TWO, " segments SM ende: " + segments.get(0).getNodeIds().size());
        return segments;
    }

    public float getAngle(int firstItem, int secondItem, int thirdItem, CustomNodes cn){
        //do some stuff

        return angle;
    }
}


抱歉,要阅读的内容很多,我想做的是:一个细分具有一个ID和一个NodeID的ArrayList。我收集所有NodeID,直到没有通过getAnglecheck,然后转到下一段。

我使用ONE标记登录的地方,所有NodeID都在该段中。我用两个标签Log.d时,NodeID的ArrayList为空。当我返回线段ArrayList时,其中的线段在那里(有一个ID),但是所有线段的NodeID- ArrayLists都是空的。我在哪里丢失内容?我为此感到疯狂。

最佳答案

您的问题源于对Java如何处理对象和引用的误解。

segmentNodes.add(myTrip.getTripItem(i));
Segment segment = new Segment();
segment.setId(count);
segment.setNodeIds(segmentNodes);

Log.d(TAG, "in SM segment " + segment.getId() + " nodes: "
    + segment.getNodeIds().toString());
segmentNodes.clear();
count++;
segments.add(segment);


让我们看一下在“存储”对象时Java将使用什么对象。在第一个块中,您向segmentNodes添加了一个“行程”。然后,将对segmentNodes的引用添加到新创建的Segment对象。因为您添加了参考,所以对segmentNodes所做的所有更改也将在SegmentsegmentNodes参考中显示。

然后,您打印了一些数据,但是您没有做任何更改,因此什么都应该更改。

然后,您呼叫segmentNodes.clear()。这清除了segmentNodes中的所有数据,但是由于您对segmentNodes实例提供了segment的引用,因此它也丢失了所有整数。现在,如果您希望segment对象具有其自己的segmentNodes列表副本,以便对segmentNodes列表所做的更改不会影响Segment实例中的列表。

为此,请手动创建一个副本:

ArrayList<Integer> segCopy = new ArrayList<Integer>();
for(Integer i : segmentNodes){
    segCopy.add(i);
}
segment.setNodeIds(segCopy);
segmentNodes.clear();


Java不传递对象的副本,而是传递引用的副本。您可能会发现关于此主题的Stackoverflow Question很有帮助。

07-28 00:35