So, this is my 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;
}
}
I’m sorry, it’s much to read, what I’m trying to do is: a Segment has an ID and an ArrayList of NodeIDs. I collect all the NodeIDs until one doesnt pass the getAngle- check, then go to the next segment.
Where I Log.d with the ONE tag, all the NodeIDs are in the segment. Where I Log.d with the TWO tag, the ArrayList of NodeIDs is empty. When I return the segments- ArrayList, the segments in it are there (havin an ID), but the NodeID- ArrayLists of all the segments are empty. Where am I losing the content? I’m going crazy over this.
Your issue stems from a misunderstanding of how Java handles Objects and references.
Let’s take a look at what Java is going to your objects as you “store” them. In the first chunk, you added a “trip” to
segmentNodes. Then you added a reference tosegmentNodesto the newly created Segment object. Because you added a reference, all changes made tosegmentNodeswill also be seen within theSegment‘s reference ofsegmentNodes.Then you printed some data out, but you aren’t altering anything so nothing should change.
Then, you call
segmentNodes.clear(). This cleared out all the data insegmentNodes, but since you gave a reference ofsegmentNodesto thesegmentinstance, it lost all the integers, too. Now, if you want thesegmentobject to have its own copy of thesegmentNodeslist so that changes to thesegmentNodeslist does not affect the list in the Segment instance.To do that, manually create a copy:
Java does not pass copies of Objects, it passes a copy of the reference. You may find this Stackoverflow Question about this topic helpful.