括号的改变风格
你好,我想编写一个程序,从下一行括号风格改变了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));
}
}
}
您应该能够使用正则表达式匹配来做到这一点。
这应该下面括号理清所有打开的括号:
String outputString = inputString.replaceAll("\)\s*\{", ") {");
我太累了,现在要弄清楚如何匹配类的声明后开括号,但它应该可以用正则表达式。
我今天早上重新阅读这一点,并意识到使用正则表达式是相当薄弱的。有太多的边缘情况下,它不会工作(如包含花括号的字符串)。与创建自己的编译器相比,这是一个非常具有挑战性的问题:-( – kabadisha
嗨,是你投票选出我的解决方案吗?:-) – user3437460
是的:-)就是我。 – kabadisha
I'm suppose to write a program that changes the Java program from next-line brace style to the end-of-line brace style
这是一个想法,你可以做什么:
- 读通过线
- 商店代码当前行的Java文件中的行成一个列表(根据需要由您的要求)
- 如果当前行是空的(换行符或只包含空格),
emptyLine++;
- 继续操作,直到找到非空行。
- 如果现在,你击中了一行并不以
{
开头的行,将n
的行数加到列表中,n equals value of emptyLine
然后添加那个非空行。emptyLine = 0;
- 否则,如果您点击的行是
{
,则从您的列表中删除先前添加的字符串中的最后一个换行符,并直接将当前代码行添加到列表中(而不添加您刚刚计算的所有换行符)。emptyLine = 0;
- 继续该过程,直到到达文件结尾。
- 关闭文件扫描器并根据您的列表将其写回文件中。
您可以创建一些辅助的方法来帮助你,例如:
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
我会建议你做一些练习上读取和写入到文件第一。
嗯,为什么downvote? – user3437460
是的,我想知道同样的事情:-(你的回答比我的更全面,看起来像是会起作用。从我这里得到一个赞成票:-) – kabadisha
我为这个问题编写了一些代码,但它遇到了错误;(你能检查出来吗?任何事情都可以帮助 –
看看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(" {");
(这只是一个例子)
我在上面的代码中加入了一些代码,但即时错误会遇到你可以帮助我的那个 –
你会得到哪些错误你的for循环将不会产生所需的输出结果这就是你的意思?这就是我使用栈的意思:在开始写入输出文件之前,你可以操作代码,使用栈而不是ArrayList并在阅读过程中修改你的代码:当你看到一个“{”时,弹出,直到你得到所需的代码行,追加“{”并将结果放回堆栈 – delucasvb
例外线程“main”java.lang.Error:未解决的编译问题:语法错误,插入“VariableDeclarators”以完成LocalVariableDeclaration close无法解析或者不是字段在Extension.main处重复局部变量f(Extension.java:35) –
这会寻找任何卷曲在文件中使用大括号还是只对Java编译器有特定含义的文件?如果是后者,你必须真正理解你解析的内容。这不是一项简单的任务。 –
不仅仅是对编译器有特定含义的花括号,并将其更改为下一行样式 –
任何原因您将无法使用您的ide-of-choice的现有格式器? – Marvin