2016-02-04 3 views
0

Здравствуйте, я предполагаю, чтобы написать программу, которая изменяет программу Java из следующей строки стиля распорки в конце-строки брекет стиля, как этотИзменения стиля фигурных скобок

общественного класс Test

{ 

    public static void main(String [] args) 

    { 


    if (expr) 

    { 

    } 
} 

Для этого

public class Test { 

    public static void main(String [] args) { 

    if (expr) { 

    } 

} 

программа должна читать от пользователя (Prompt их "Введите имя файла:") имя файла, содержащего программу для изменения. Если файл не может быть открыт, напечатайте сообщение об ошибке пользователю («Bad filename») и запросите их снова, чтобы ввести имя файла, а измененный файл должен быть записан обратно в тот же файл, который вы читаете . Вы не можете открыть файл для чтения, в то же время он открыт для записи. Таким образом, вы должны хранить строки, которые вы хотите записать в файл в качестве 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

По какой-либо причине вы не сможете использовать существующий форматтер вашего идеала? – 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. чтение из строки файла 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 
} 

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

Хм, почему нисходящий? – user3437460

+0

Да, мне интересно то же самое :-(Ваш ответ гораздо более всеобъемлющий, чем мой, и похоже, что он сработает.У меня есть один отзыв :-) – kabadisha

+0

Я написал код для этой проблемы, но он запутался в ошибках (можно проверить это. Все может помочь –

0

Ознакомьтесь с классами ввода/вывода Java, в частности File, BufferedReader и InputStreamReader. Вы можете прочитать из консоли, поставив BufferedReader на System.in, например, так:

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

Тогда вы можете просто использовать

String input = stdIn.readLine(); 

Есть читатели и писатели для файлов, а также. Посмотрите, например, на FileInputStream! Возможно, this также может помочь вам.

Что касается ошибки «Bad filename», это может быть сделано путем ловли Исключения.

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(), чтобы получить предыдущую строку кода. Вы можете поместить некоторое время петлю вокруг того, чтобы хлопать, пока вы не получите непустой или пробелом строку кода:

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

(Это просто пример)

+0

Я ввел некоторые из них в свой код, который был указан выше, но im работает с ошибками, вы можете помочь мне с этим –

+0

Какие ошибки вы получаете «Ваш for-loop не приведет к желаемому результату. Это то, что вы имеете в виду? Это то, что я имел в виду, используя Stack: вы можете манипулировать кодом перед началом записи в выходной файл. Используйте Stack вместо ArrayList и измените свой код во время чтения: когда вы увидите «{», поп, пока не получите нужную строку кода, добавьте «{» к нему и верните результат в стек. – delucasvb

+0

Исключение из thread "main" java.lang.Error: Неразрешенные проблемы с компиляцией: Ошибка синтаксиса, вставка "VariableDeclarators" для завершения LocalVariableDeclaration close не может быть разрешена или не является полем Дублировать локальную переменную f в Extension.main (Extension.java:35) –

Смежные вопросы