gpt4 book ai didi

java - ArrayList 的内容消失了

转载 作者:行者123 更新时间:2023-12-01 15:10:12 25 4
gpt4 key购买 nike

所以,这是我的类(class):

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

抱歉,要读的东西太多了,我想做的是:一个 Segment 有一个 ID 和一个 NodeID 的 ArrayList。我收集所有 NodeID,直到其中一个未通过 getAngle 检查,然后转到下一段。

在我使用 ONE 标签的 Log.d 中,所有 NodeID 都在该段中。在我使用 TWO 标签的 Log.d 中,NodeID 的 ArrayList 为空。当我返回segments-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 将对其进行哪些处理。在第一个 block 中,您向 segmentNodes 添加了一个“行程”。然后,您向新创建的 Segment 对象添加了对 segmentNodes引用。由于您添加了引用,因此对 segmentNodes 所做的所有更改也将在 SegmentsegmentNodes 引用中看到。

然后您打印了一些数据,但您没有更改任何内容,因此不应更改任何内容。

然后,您调用segmentNodes.clear()。这清除了 segmentNodes 中的所有数据,但由于您向 segment 实例提供了 segmentNodes 的引用,它也丢失了所有整数。现在,如果您希望 segment 对象拥有自己的 segmentNodes 列表副本,以便对 segmentNodes 进行更改> list 不影响Segment实例中的list。

为此,请手动创建副本:

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

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

关于java - ArrayList 的内容消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12431500/

25 4 0