【问题标题】:Changing Style of the braces改变牙套的样式
【发布时间】:2016-02-04 23:40:55
【问题描述】:

你好,我想写一个程序来改变 Java 程序 从下一行大括号样式到像这样的行尾大括号样式

公开课测试

{

     public static void main(String [] args)

    {


    if (expr)

    {

    }
}

到此

public class Test {

    public static void main(String [] args) {

    if (expr) {

    }

}

程序应该从用户那里读入(提示他们“输入文件名:”) 包含要更改的程序的文件的名称。如果文件不能 打开,向用户打印一条错误消息(“Bad filename”)并提示 他们再次输入文件名,修改后的文件应该写回你阅读的同一个文件 从。您不能在打开文件的同时打开文件以供阅读 写作。因此,您应该存储要写入文件的行 在字符串的 ArrayList 中,然后在完成后将它们写入文件 关闭了你用来读取文件的 Scanner 对象

这是我到目前为止所写的,我遇到了错误。谁能帮忙, 谢谢

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



   }

}

【问题讨论】:

  • 这会查找文件中的任何花括号,还是仅查找对 Java 编译器具有特定含义的花括号?如果是后者,您必须真正了解您正在解析的内容的上下文。这绝非易事。
  • 不只是对编译器具有特定含义的花括号,并将其更改为下一行样式
  • 有什么理由不能使用您选择的现有格式化程序?
  • 在我看来,这就像老师设置的经典简单编码挑战 - 在这种情况下,我希望大括号的上下文并不重要。
  • 我们假设使用eclipse,只需更改对编译器重要的大括号

标签: java arraylist file-io printwriter


【解决方案1】:

我想编写一个程序,将 Java 程序从下一行大括号样式更改为行尾大括号样式

这是你可以做的一个想法:

  1. 逐行读取Java文件
  2. 将当前代码行存储到列表中(根据您的要求)
  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
}

我不知道从哪里开始,我很困惑,我不知道如何使用 Text I/o 在这一点上任何东西都可以帮助我

我建议你先做一些读写文件的练习。

【讨论】:

  • 是的,我也在想同样的事情 :-( 你的回答比我的要全面得多,而且看起来会奏效。请给我一票 :-)
  • 我为这个问题写了一些代码,但它遇到了错误;(你能检查一下吗。任何事情都可以帮助
  • @MelDavid 嗨,我建议您打开一个新问题来询问您的代码。编辑您的问题将拒绝此处的所有答案,这应该解决您之前的问题。
【解决方案2】:

您应该能够使用正则表达式匹配来做到这一点。

这应该整理出括号后面的任何左大括号:

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

我现在太累了,不知道如何匹配类声明后的左大括号,但它应该可以使用正则表达式。

【讨论】:

  • 今天早上我重新阅读了这篇文章,并意识到使用正则表达式非常弱。有太多的边缘情况不起作用(比如包含花括号的字符串)。与创建自己的编译器相比,这是一个非常具有挑战性的问题:-(
  • 谢谢-您不必这样做 :-) 回想起来,我的解决方案有点裤子。正则表达式很棒,但可能不是正确的方法。我想这就是在疲倦时阅读 Stack Overflow 的危险。
【解决方案3】:

看看 Java I/O 类,特别是 File、BufferedReader 和 InputStreamReader。您可以通过在 System.in 上放置一个 BufferedReader 从控制台读取,如下所示:

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

那么你可以简单地使用

String input = stdIn.readLine();

文件也有读取器和写入器。以 FileInputStream 为例!或许this也能帮到你。

至于“Bad filename”错误,可以通过捕获Exceptions来完成。

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

看看 Oracle 的 this 课程。

要查看当前行是否只包含大括号,最好先检查一下:

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
}

Stack 数据结构可以帮助您追加到前面的行。它是一个 LIFO 结构,就像您的日常堆栈一样。您可以使用 myStack.pop() 来获取上一行代码。你可以在它周围放置一个while循环来不断弹出,直到你得到一个非空或空白的代码行:

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

(这只是一个例子)

【讨论】:

  • 我在上面的代码中实现了一些,但我遇到了错误,你能帮我解决这个问题吗
  • 您遇到了哪些错误?您的 for 循环不会产生所需的输出。你是这个意思吗?这就是我使用堆栈的意思:您可以在开始写入输出文件之前操作代码。使用 Stack 而不是 ArrayList 并在阅读过程中修改代码:当您看到“{”时,弹出直到获得所需的代码行,将“{”附加到它并将结果放回堆栈中。
  • 线程“main”java.lang.Error中的异常:未解决的编译问题:语法错误,插入“VariableDeclarators”以完成LocalVariableDeclaration关闭无法解决或不是字段重复局部变量f在扩展。 main(Extension.java:35)
  • 这就是我遇到的问题
  • 替换“f.close;”通过“f.close();”
猜你喜欢
  • 2010-11-27
  • 2019-05-13
  • 1970-01-01
  • 2015-01-05
  • 2014-07-27
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多