2016-02-04 126 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) –