2012-09-14 22 views
0

所以,這是我的課:的ArrayList的內容不見了

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和NodeIDs的ArrayList 。我收集所有NodeID,直到一個不通過getAngle檢查,然後轉到下一個分段。

其中我使用ONE標記Log.d,所有NodeID都在該段中。在我使用TWO標記Log.d的情況下,NodeID的ArrayList是空的。當我返回segments-ArrayList時,其中的片段在那裏(擁有一個ID),但是所有片段的NodeID ArrayList都是空的。我在哪裏丟失內容?我爲此瘋狂。

+0

我刪除了兩個segmentNodes.clear(),現在它不像我期望的那樣工作,但至少在這些ArrayList中有一些內容。這對我來說是全新的,它也清除了我已經「儲存」的ArrayLists。謝謝一堆! – FWeigl

回答

1

您的問題源於對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所作的更改也將在Segment的參考文獻segmentNodes中看到。

然後你打印了一些數據,但你沒有改變任何東西,所以什麼都不應該改變。您可以撥打segmentNodes.clear()。這清除了segmentNodes中的所有數據,但由於您將segmentNodes引用到segment實例,所以它也丟失了所有整數。現在,如果您希望segment對象具有其自己的副本列表的副本,以便更改列表不會影響該段實例中的列表。

要做到這一點,手動創建一個副本:

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

Java不傳遞對象的副本,它通過引用的副本。您可能會發現這個Stackoverflow Question有關此主題有幫助。

+0

非常感謝您的解釋。有點奇怪,在一年多的Java編程中,我從來沒有遇到過這種情況。 – FWeigl