0

だから、これは私のクラスです:

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 があるということです。getAngle-check を通過しなくなるまですべての NodeID を収集し、次のセグメントに進みます。

ONE タグを使用して Log.d を実行すると、すべての NodeID がセグメント内にあります。TWO タグを使用して Log.d を実行すると、NodeID の ArrayList は空になります。セグメント ArrayList を返すと、その中のセグメントは (ID を持って) そこにありますが、すべてのセグメントの NodeID-ArrayLists は空です。コンテンツはどこで失われますか? 私はこれに夢中になります。

4

1 に答える 1

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。次に、新しく作成した Segment オブジェクトへの参照を追加しました。segmentNodes参照を追加したため、 に加えられたすべての変更は、の の参照segmentNodes内にも表示されます。 SegmentsegmentNodes

次に、いくつかのデータを出力しましたが、何も変更していないため、何も変更されません。

次に、 を呼び出しますsegmentNodes.clear()。これにより のすべてのデータが消去されましたが、インスタンスへのsegmentNodes参照を指定したため、すべての整数も失われました。ここで、オブジェクトにリストの独自のコピーを持たせて、リストへの変更がSegment インスタンスのリストに影響を与えないようにする場合。segmentNodessegmentsegmentsegmentNodessegmentNodes

これを行うには、手動でコピーを作成します。

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

Java はオブジェクトのコピーを渡すのではなく、参照のコピーを渡します。このトピックに関するこのStackoverflow Questionが役立つ場合があります。

于 2012-09-14T21:06:26.497 に答える