1

クリティカル パス法を使用して、クリティカル パスを計算しようとしています。いくつかのテスト ケースがあり、出力は「tarea2.out」というファイルに出力されます。

問題は、ファイルを印刷すると、ケースごとに出力を上書きしているように見え、最終的には最後の出力のみが表示されることです。私はそれがばかげていることを知っていますが、私はJavaが初めてで、出力を正しくすることができません

これが私のコードです:

package tarea;

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 *
 * @author Francisco
 */
public class Main {
    public static int c;

    public static void recorrido(int[][] adj) throws IOException{
        int n=adj.length;
        int casitas[][] = new int[n][2];
        int mejorCamino[] = new int [n];

        int temp;

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                temp = adj[i][j];
                if(temp > -1){
                    if(temp + casitas[i][0]>casitas[j][0]){
                        casitas[j][0] = temp + casitas[i][0];
                        mejorCamino[j] = i;
                    }
                }
            }
        }
        //Hacemos el paso hacia atrás.
        for(int y=0;y<n;y++)
        casitas[y][1] = casitas[n-1][0];

        for (int j=n-1;j>=0;j--){
            for(int i=0;i<n;i++){
                temp = adj[i][j];
                 if(temp > -1){
                    casitas[i][1]= Math.min(casitas[j][1] - temp , casitas[i][1]);
                }
            }
        }

        int x=n-1;
        String cam = "";
        while(x>0){
            if(x==n-1)
                cam= mejorCamino[x] + " " + x;
            else
                cam= mejorCamino[x] + " " + x + "\n" + cam;
            adj[mejorCamino[x]][x] = -1;
            x = mejorCamino[x];

        }

        //Calculamos las holguras con nuestra nueva matriz
        String mac="";
        int HT , HL;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                temp = adj[i][j];
                if (temp > -1){
                    HT = casitas[j][1] - temp - casitas[i][0];
                    HL = casitas[j][0] - temp - casitas[i][0];
                    mac += "\n" + i + " " + j + " " + HT + " " + HL;
                    if (HT>HL)
                        mac += " R";
                }
            }
        }

        String sFichero = "tarea2.out";
        File fichero = new File(sFichero);

        BufferedWriter bw = new BufferedWriter(new FileWriter(sFichero));

        bw.write("Case " + c + ": total duration " + casitas[n-1][0] );
                 bw.write("\n");
                 bw.write(cam);
                 bw.write(mac);
                 bw.write("\n");

                 // Hay que cerrar el fichero
        bw.close(); 
    }


}
4

1 に答える 1

4

メソッドを呼び出すたびに BufferedWriter を作成していますrecorrido

BufferedWriter bw = new BufferedWriter(new FileWriter(sFichero));

ファイルは毎回書き換えられます。パラメータをコンストラクタに追加してtrue、追加モードでファイルを開くことを伝えます

BufferedWriter bw = new BufferedWriter(new FileWriter(sFichero, true));

recorridoまた、ファイルを何度も開いたり閉じたりするのではなく、すべてのアプリケーションで一度ファイルを開き、コンテンツを書き込むだけの方がよいでしょう。

于 2012-04-26T22:06:35.913 に答える