2016-02-04 127 views
0

你好,我想編寫一個程序,從下一行括號風格改變了Java程序 到結束行的括號風格像這樣括號的改變風格

公共類測試

{ 

    public static void main(String [] args) 

    { 


    if (expr) 

    { 

    } 
} 

對此

public class Test { 

    public static void main(String [] args) { 

    if (expr) { 

    } 

} 

程序應該從用戶(通過 「輸入文件名:」 促使它們)在讀 包含要更改的程序的文件的名稱。如果打開的文件不能爲 ,則向用戶打印錯誤消息(「錯誤文件名」),並再次提示 輸入文件名,並將修改後的文件寫回到您從中讀取 的同一文件。您不能在打開 的同時打開文件進行閱讀。所以,你應該存儲要寫入到字符串的ArrayList的文件 行,然後將其寫入到文件後,你 關閉您用來讀取文件

這是掃描對象我到目前爲止寫了什麼,而且我遇到了錯誤。誰能幫助, 謝謝

import java.util.ArrayList; 
import java.util.Scanner; 
import java.io.File; 
import java.io.PrintWriter; 

public class Extension { 

    public static void main(String[] args){ 
     Scanner input = new Scanner(System.in); 
     String fileName = ""; 
     System.out.println("Enter File Name: "); 
     fileName = input.next(); 
     File f = new File("src/" + fileName); 
     do{ 
     if(f.exists()){ 

       } 
     else{ 
     System.out.println("Bad filename"); 
     System.out.println("Enter File Name: "); 
     fileName = input.nextLine(); 
    } 

    } while (!(f.exists())); 

    ArrayList<String> fileRead = new ArrayList<String>(); 
    String paran = ("{"); 
    String newLine = ""; 
    while(input.hasNextLine()) { 
    fileRead.add(input.nextLine()); 
    } 
    input.close(); 
    f.close; 
    //File f = new File("src/"+ fileName); 

    PrintWriter output = new PrintWriter(f); 
    output.print(fileRead.get(0)) ; 
    for(int i = 1; i < fileRead.size()-1 ; i++){ 
     if(fileRead.get(i).equals("{")){ 
     newLine = fileRead.get(i-1); 
     newLine += paran; 
    } 
    else 
    output.print(fileRead.get(i)); 
    } 



    } 

} 
+0

這會尋找任何捲曲在文件中使用大括號還是隻對Java編譯器有特定含義的文件?如果是後者,你必須真正理解你解析的內容。這不是一項簡單的任務。 –

+0

不僅僅是對編譯器有特定含義的花括號,並將其更改爲下一行樣式 –

+0

任何原因您將無法使用您的ide-of-choice的現有格式器? – Marvin

回答

0

您應該能夠使用正則表達式匹配來做到這一點。

這應該下面括號理清所有打開的括號:

String outputString = inputString.replaceAll("\)\s*\{", ") {"); 

我太累了,現在要弄清楚如何匹配類的聲明後開括號,但它應該可以用正則表達式。

+0

我今天早上重新閱讀這一點,並意識到使用正則表達式是相當薄弱的。有太多的邊緣情況下,它不會工作(如包含花括號的字符串)。與創建自己的編譯器相比,這是一個非常具有挑戰性的問題:-( – kabadisha

+0

嗨,是你投票選出我的解決方案嗎?:-) – user3437460

+0

是的:-)就是我。 – kabadisha

1

I'm suppose to write a program that changes the Java program from next-line brace style to the end-of-line brace style

這是一個想法,你可以做什麼:

  1. 讀通過線
  2. 商店代碼當前行的Java文件中的行成一個列表(根據需要由您的要求)
  3. 如果當前行是空的(換行符或只包含空格),emptyLine++;
  4. 繼續操作,直到找到非空行。
  5. 如果現在,你擊中了一行並不以{開頭的行,將n的行數加到列表中,n equals value of emptyLine然後添加那個非空行。 emptyLine = 0;
  6. 否則,如果您點擊的行是{,則從您的列表中刪除先前添加的字符串中的最後一個換行符,並直接將當前代碼行添加到列表中(而不添加您剛剛計算的所有換行符)。 emptyLine = 0;
  7. 繼續該過程,直到到達文件結尾。
  8. 關閉文件掃描器並根據您的列表將其寫回文件中。

您可以創建一些輔助的方法來幫助你,例如:

public boolean isEmptyLine(String text){ 
    //Return true if text only contains whitespace, tabs & newline 
} 

I have no clue where to start and I'm very confused and I don't know how to use Text I/o any thing can help me at this point

我會建議你做一些練習上讀取和寫入到文件第一。

+0

嗯,爲什麼downvote? – user3437460

+0

是的,我想知道同樣的事情:-(你的回答比我的更全面,看起來像是會起作用。從我這裏得到一個贊成票:-) – kabadisha

+0

我爲這個問題編寫了一些代碼,但它遇到了錯誤;(你能檢查出來嗎?任何事情都可以幫助 –

0

看看Java I/O類,特別是File,BufferedReader和InputStreamReader。您可以通過將一個BufferedReader上System.in,像這樣從控制檯讀取:

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 

然後,你可以簡單地使用

String input = stdIn.readLine(); 

有讀者和作家的文件也是如此。以FileInputStream爲例!也許this也可以幫助你。

至於「錯誤的文件名」錯誤,這可以通過捕獲異常來完成。

try { 
    File inputFile = new File(filename); 
} 
catch (Exception e) { // You replace this catch by any kind of exception, e.g. an IOException. You can add as many catches as necessary. A modern IDE or your compiler will tell you that you forgot to catch a specific Exception as well. 
    System.out.println("Bad filename"); 
} 

看一看this來自Oracle的課程。

要查看當前行只包含一個括號,一個良好的開端可能是檢查:

String tmp = currentLine.trim(); 
if (tmp.equals("{")) { 
    // Do what you have to do with opening braces 
} else if (tmp.equals("}")) { 
    // Do what you have to do with closing braces 
} 

棧數據結構可以幫助你追加到以前行。這是一個LIFO結構,就像你的日常堆棧一樣。您可以使用myStack.pop()獲取上一行代碼。你可以把一個while循環圍繞以不斷出現,直到你得到的代碼非空或空白行:

String lastLine; 
while ((lastLine = myStack.pop()).trim().equals("")) 
    continue; 
lastLine.append(" {"); 

(這只是一個例子)

+0

我在上面的代碼中加入了一些代碼,但即時錯誤會遇到你可以幫助我的那個 –

+0

你會得到哪些錯誤你的for循環將不會產生所需的輸出結果這就是你的意思?這就是我使用棧的意思:在開始寫入輸出文件之前,你可以操作代碼,使用棧而不是ArrayList並在閱讀過程中修改你的代碼:當你看到一個「{」時,彈出,直到你得到所需的代碼行,追加「{」並將結果放回堆棧 – delucasvb

+0

例外線程「main」java.lang.Error:未解決的編譯問題:語法錯誤,插入「VariableDeclarators」以完成LocalVariableDeclaration close無法解析或者不是字段在Extension.main處重複局部變量f(Extension.java:35) –