For loop พิมพ์ไม่ถูกต้อง

สิ่งที่ฉันพยายามทำคือให้มันใช้ไฟล์จาวาที่มีลักษณะเช่นนี้

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

และควรจะส่งออกไฟล์ข้อความโดยมีระยะห่างและการเยื้องที่เหมาะสม จนถึงตอนนี้ฉันสามารถเยื้องที่ถูกต้องสำหรับบรรทัดแรกได้ แต่ฉันมีปัญหากับ for วงที่สองที่พิมพ์ช่องว่างสำหรับวงเล็บปิด วงเล็บปิดท้ายจะพิมพ์ออกมาด้านนอกเหมือน 3 บรรทัดแรกแทนที่จะพิมพ์เข้าด้านใน ขออภัยหากตัวแปรของฉันทำให้สับสน

นี่คือรหัสของฉันจนถึงตอนนี้

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);
        }
    }
}

สิ่งที่ให้ฉันคือ

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

สิ่งที่ฉันปรารถนาคือสิ่งนี้

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

person Brent    schedule 16.05.2013    source แหล่งที่มา
comment
คุณคาดหวังที่จะพิมพ์อะไร และขณะนี้มีการพิมพ์ตัวอย่างอย่างไร   -  person Smit    schedule 16.05.2013
comment
อย่าเขียน if (line.contains("{") == true) { เพียงแค่เขียน if (line.contains("{")) {   -  person jlordo    schedule 16.05.2013
comment
เราจำเป็นต้องดูไฟล์อินพุต เอาต์พุตปัจจุบัน และเอาต์พุตที่ต้องการ   -  person BLuFeNiX    schedule 16.05.2013
comment
อย่าลืมตรวจสอบวงเล็บปีกกาภายในตัวอักษรสตริงเพิ่มเติม ไม่เช่นนั้นการจัดรูปแบบของคุณจะดูน่าเกลียด   -  person mschenk74    schedule 18.05.2013
comment
ฉันไม่รู้ว่าคุณได้ผลลัพธ์นั้นมาได้อย่างไร เพราะการพูดว่า if (line.contains("{") == true) { โดยพื้นฐานแล้ว คุณจะเพิกเฉยต่อข้อความที่เหลือและจัดการเฉพาะ { เท่านั้น   -  person zEro    schedule 20.05.2013


คำตอบ (1)


โอเค ฉันได้ปรับโครงสร้างบางสิ่งใหม่ (และจำเป็น) แต่มันทำงานได้ตรงตามที่คุณคาดหวังไว้ (AFAIK!)

นี่คือรหัส:

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
ปัญหานี้ดีมาก แต่ฉันไม่สามารถเปลี่ยนวิธีการหลักใดๆ ของฉันได้ และรหัสเดียวที่ฉันสามารถเพิ่มได้คือหลังจากการพ่น FileNotFoundException - person Brent; 21.05.2013
comment
@BrentColeman มันคงไม่โง่ที่จะไม่เปลี่ยนรหัสหรือการออกแบบเมื่อเรารู้ว่ามันผิด คุณต้องจำการเปลี่ยนแปลงใน counter และวิธีเดียวที่ฉันนึกถึงในการตั้งค่าปัจจุบันของคุณคือการทำให้มันเป็นตัวแปรคงที่ สิ่งอื่นใดที่เราลองและเราอาจจะเบี่ยงเบนไปจากเทมเพลตของคุณอีกต่อไป เปลี่ยนการออกแบบ -- ถ้าจำเป็น -- เพื่อให้สิ่งต่าง ๆ สำเร็จลุล่วงได้อย่างถูกวิธี!! - person zEro; 22.05.2013