0

したがって、8 つのエントリを持つ Graph という ArrayList があります。エントリ 1 は「ソース」と呼ばれる整数配列への参照であり、エントリ 2 ~ 8 は「データ」と呼ばれる整数配列への参照です。ただし、私が本当にやりたかったのは、データへの参照を保存するのではなく、「ソース」と「データ」内にデータを保存することだけでした。このため、「データ」を変更すると「グラフ」が台無しになり、「グラフ」に格納されたデータを編集するのは面倒です。

この時点で、while/for ループで一度に 1 つずつ「Graph」からデータを引き出し、それを temp という整数配列に格納し、temp を変更してから「Graph」に格納できるようにしたいと考えています。 、しかし、これは最終的に「Graph」のすべてのエントリが「temp」への参照であり、最終的にはすべて同じ値を持つことを意味するため、これは機能しません。これはもちろん間違っています。

この問題を回避できるように、Graph でデータを編集する、またはこれを再構築する良い方法は何ですか?

これがコードです。グラフの作成方法を示すテキスト ファイルからデータを読み込んでいます。

    BufferedReader br = new BufferedReader(new FileReader("graph.txt"));
    StringBuilder sb = new StringBuilder();
    String line = br.readLine();

    while(line.charAt(z)!=' '){
        sizeString=sizeString+line.charAt(z);
        z++;
    }
     size = Integer.valueOf(sizeString);
     int graph[][] = new int[size][size];

    while (line != null) {
        sb.append(line);
        sb.append("\n");
        line = br.readLine();
        z=0;
        if(line != null){
            while(line.charAt(z)!=' '){
                xString=xString+line.charAt(z);
                z++;
            }
            z++;
            while(line.charAt(z)!=' '){
                yString=yString+line.charAt(z);
                z++;
            }
            z++;
            while(z<line.length()){
                weightString=weightString+line.charAt(z);
                z++;
            }
            System.out.println(xString+yString+weightString);
            x=Integer.valueOf(xString);
            y=Integer.valueOf(yString);
            weight=Integer.valueOf(weightString);

            graph[x][y]=weight;
            xString="";yString="";weightString="";
            vertices++;     
        }
    }

    //Set non adjacent node weights to infinity
    ArrayList Graph = new ArrayList();
    int[] source = new int[2];
    int[] data = new int[2];

    source[0]=0;
    source[1]=-1;

    Graph.add(0,source);

    data[0]=99999;      //Represents 'infinity'
    data[1]=-1;         //No source node
    x=1;

    while(x<graph.length){
        Graph.add(x, data);
        x++;
    }
4

1 に答える 1

1

わかりました、コメントへの返信に基づいて回答を提供しようと思います。サンプル コードに 'temp' という名前の変数が見当たらないので、まだその部分を書き込もうとしていないと思います。

List<int[]> Graph = new ArrayList<int[]>(8); //specify the capacity if it is fixed
//Your existing code that populates Graph here...
for (int[] temp : Graph) {
    //Do some operations on temp...
}

または、Graph の要素 1..n のみを操作する場合:

for (int ii = 1; ii < Graph.size(); ii++) {
    int[] temp = Graph.get(ii);
    //Do some operations on temp...
}

また、参照を保存したくない場合は、グラフにデータを入力するときに、配列のコピーを作成して保存する必要があります。

int[] srcCopy = new int[source.length];
System.arraycopy(source, 0, srcCopy, 0, source.length);

「Graph」の代わりに別の変数名を使用することもお勧めします。大文字の識別子は、クラス/インターフェイス変数にのみ使用する必要があります。

于 2012-11-19T20:23:02.110 に答える