For loop tidak dicetak dengan benar.

Apa yang saya coba lakukan adalah mengambil file Java yang terlihat seperti ini

public class test1 {
public static void main ( string[] args ) {
System.out.println( "This is Test 1." );
}
}

Dan itu seharusnya menghasilkan file teks dengan spasi dan indentasi yang tepat. Sejauh ini saya bisa mendapatkan indentasi yang benar untuk baris pertama. Tapi saya mengalami masalah dengan loop for kedua yang mencetak spasi untuk tanda kurung akhir. Tanda kurung akhir dicetak ke luar seperti 3 baris pertama, bukan ke dalam. Maaf jika variabel saya membingungkan.

Ini kode saya sejauh ini

public class JavaJustifier {
public static void main( String[] args ) 
           throws FileNotFoundException {

    for( int i = 1; i < 6; i++ ) {
        justifyJava( "Test" + i + ".java", 
                     "Justified" + i + ".txt", 
                     4 );
    }                
}
public static void justifyJava( String inputFileName,
                                String outputFileName,
                                int tabSize ) 
        throws FileNotFoundException {


    int counter = 0;
    int counter2 = 0;
    int blah = 0;
    File f = new File(inputFileName);
    File p = new File(outputFileName);
    if  (p.exists())
        p.delete();
    Scanner input = new Scanner (f);
    PrintStream name = new PrintStream(new File(outputFileName));

    while (input.hasNextLine()) {
        String line = input.nextLine();
        Scanner lineScan = new Scanner(line);
        if (line.contains("{") == true) {
            name.print("{\r\n");
            counter++;
            for (int i = 1; i <= counter; i++) {
                for (int j = 0; j <= tabSize; j++) {
                    name.print(" ");
                }
            }
            System.out.println(counter);
        } else if (line.contains("}") == true) {
            name.print("\r\n");
            counter--;
            for (int x = 1; x <= counter; x++) {
                for (int y = 1; y <= tabSize; y++) {
                    name.print(" ");
                }
            }
            name.print("}");
            System.out.println(counter);
        } else {
            name.print(line);
        }
    }
}

Apa yang diberikannya kepada saya adalah

public class Test1 
{
    public static void main( String[] args ) 
    {
        System.out.println( "This is Test 1." );
}
    }

Yang saya inginkan adalah ini

public class Test1 
{
    public static void main( String[] args ) 
    {
        System.out.println( "This is Test 1." );
    }
}

person Brent    schedule 16.05.2013    source sumber
comment
Apa yang ingin Anda cetak dan bagaimana pencetakannya saat ini beserta contohnya?   -  person Smit    schedule 16.05.2013
comment
Jangan tulis if (line.contains("{") == true) {, cukup tulis if (line.contains("{")) {   -  person jlordo    schedule 16.05.2013
comment
Kami perlu melihat file masukan Anda, keluaran saat ini, dan keluaran yang diinginkan.   -  person BLuFeNiX    schedule 16.05.2013
comment
Ingatlah untuk melakukan beberapa pemeriksaan tambahan untuk kurung kurawal di dalam string literal - jika tidak, format Anda akan menjadi jelek.   -  person mschenk74    schedule 18.05.2013
comment
Saya tidak tahu bagaimana Anda mendapatkan keluaran itu karena dengan mengatakan if (line.contains("{") == true) { Anda pada dasarnya mengabaikan teks lainnya dan hanya menangani {.   -  person zEro    schedule 20.05.2013


Jawaban (1)


Oke, saya telah memfaktorkan ulang beberapa hal (dan itu perlu) tetapi berfungsi persis seperti yang Anda harapkan (AFAIK!).

Berikut kodenya:

public class JavaJustifier {
    static int counter = 0;
    static int tabSize = 4;

    public static void main(String[] args) throws FileNotFoundException {
        justifyJava("Test1.java", "Justified1.txt");
    }

    private static void processLine(PrintStream name, String line) {
        if (line.contains("{")) {
            String preText = line.substring(0, line.indexOf("{"));
            String postText = line.substring(line.indexOf("{") + 1)
                    .replaceAll("\\n", "").replaceAll("\\r\\n", "");
            printSpaces(name);
            name.println(preText);
            printSpaces(name);
            name.println("{");
            counter++;
            processLine(name, postText);

        } else if (line.contains("}")) {
            String preText = line.substring(0, line.indexOf("}"));
            String postText = line.substring(line.indexOf("}") + 1)
                    .replaceAll("\\n", "").replaceAll("\\r\\n", "");
            name.println(preText);
            counter--;
            printSpaces(name);
            name.println("}");
            processLine(name, postText);
        } else {
            if (!line.equals("\r\n") && line.length() != 0) {
                printSpaces(name);
                name.print(line);
            }
        }
    }

    private static void printSpaces(PrintStream p) {
        for (int i = 1; i <= counter; i++) {
            for (int j = 0; j <= tabSize; j++) {
                p.print(" ");
            }
        }
    }

    public static void justifyJava(String inputFileName, String outputFileName)
            throws FileNotFoundException {

        File f = new File(inputFileName);
        File p = new File(outputFileName);
        if (p.exists())
            p.delete();
        Scanner input = new Scanner(f);
        PrintStream name = new PrintStream(new File(outputFileName));

        while (input.hasNextLine()) {
            String line = input.nextLine().trim();
            processLine(name, line);
        }
    }
}
person zEro    schedule 20.05.2013
comment
Masalah dengan ini memang bagus, tetapi saya tidak dapat mengubah metode utama saya, dan satu-satunya kode yang dapat saya tambahkan adalah setelah pelemparan FileNotFoundException. - person Brent; 21.05.2013
comment
@BrentColeman Sungguh konyol jika tidak mengubah kode atau desain ketika kita tahu itu salah. Anda perlu mengingat perubahan pada counter dan satu-satunya cara yang dapat saya pikirkan dalam pengaturan Anda saat ini adalah menjadikannya variabel statis. Apa pun yang kami coba dan kami akan semakin menyimpang dari template Anda. Ubah desain -- jika perlu -- untuk menyelesaikan segala sesuatunya dengan cara yang benar!! - person zEro; 22.05.2013