Como faço para formatar esse texto? Java

votos
46

Então aqui está o problema. Transformar um arquivo de texto para a formatação correta. O ponto do problema é que eu tenho que ler um arquivo, um arquivo de texto, que contém o código no arquivo de texto. O código que tem formatação terrível. O problema de formatação é que, quando há uma chaveta como este {, a próxima linha não é de 4 espaços para a direita, é apenas tudo ao muito esquerda. Como isso:

while (blah blah blah) { 
sysout(blahblahblah);

Quando deveria ser esta:

while (blah blah blah) { 
    sysout(blahblahblah); 

E não há outras diferenças entre a 2. A única regra é simplesmente torná-lo assim que cada vez que há uma chaveta como esta {, para garantir que a próxima linha é de 4 espaços para a direita. E vice versa. Assim, cada vez que há uma chaveta assim}, a próxima linha deve ser de 4 espaços para a esquerda. Espero que vocês entendem isso.

Este é o meu problema. Eu aprendi como fazer um programa onde um pedaço de texto com múltiplos espaços e linhas é transformado em uma única linha com um único espaço de cada vez. não foi muito difícil.

Para isso, porém, eu tenho que manter tudo na mesma linha. Portanto, se há 30 linhas, o novo programa que eu faço é também 30 linhas. Eu preciso manter o espaçamento muito semelhante, mas a diferença simples é a coisa toda cinta. Então, basicamente, eu só tenho que fazer a linha após uma cinta quer 4 espaços para a direita, e depois fazer o mesmo, por isso é para os 4 espaços deixados se é uma }chaveta.

Então, como posso fazer isso exatamente? Eu não sei como apenas corrigir isso sem estragar outras coisas. É uma coisa tão simples que tenho a fazer; basta fazer as linhas a seguir as chaves 4 espaços para a direita ou esquerda, mas eu simplesmente não tenho idéia o sintaxe para usar para fazer isso. Obrigado!

EDIT: Isso pode ter apenas tornou mais fácil. Assim, basicamente, todas as linhas de cada extremidade com uma chave direita encaracolado, uma chaveta esquerda, ou um ponto e vírgula. Não importa o que. Assim, cada vez que uma dessas aparece, é o fim de uma linha. Então, talvez, se você sabe como isso faz com que seja mais fácil, então eu estou apenas deixando você sabe.

Publicado 29/02/2016 em 23:04
usuário
Em outras línguas...                            


3 respostas

votos
0

Existem programas que vão fazer isso para você automaticamente, assim você não precisa reinventar a roda. Por exemplo, no Eclipse, digite: ctrl-a(selecionar todos) ctrl-i(auto-travessão).

Respondeu 29/02/2016 em 23:43
fonte usuário

votos
0

Aqui está um pseudocódigo você pode começar com:

int indentLevel = 0;
while(currentchar = nextchar != null){
    printCurrentChar
    if(currentchar is '{'){
        indentLevel++;
    }else if(currentchar is '}'){
        indentLevel--;
    }else if(currentchar is '\n'){
        print indentLevel * 4 spaces
    }
}

você pode precisar para lidar com chaves escaparam e outras complicações embora

Respondeu 29/02/2016 em 23:54
fonte usuário

votos
0

Você pode fazer isso muito facilmente usando expressões regulares. Se você não sabe isso e planejando para ser um programador, então definitivamente aprender. Ele vai salvar para você lotes de tempo no futuro.

public class TextIndentator
{

    public static void main(String[] args) throws IOException
    {
        File uglyText = new File("ugly.txt");
        System.out.println((uglyText.exists() && !uglyText.isDirectory()) ? getNiceText(uglyText) : "FILE \"ugly.txt\" at " + System.getProperty("user.dir") + " do not exists");
    }

    static String getNiceText(File uglyText) throws IOException
    {
        // Opening file
        FileInputStream inputStream = new FileInputStream(uglyText);
        InputStreamReader isr = new InputStreamReader(inputStream);
        BufferedReader reader = new BufferedReader(isr);
        StringBuilder builder = new StringBuilder();
        StringBuffer buffer = new StringBuffer();

        // Algorithm starts here
        String line;
        boolean checkNext = false;
        while ((line  = reader.readLine()) != null)
        {
            if(checkNext)
            {
                // If previous line finished with '{' (And optionally with some whitespaces after it) then, replace any amount (including zero) of whitespaces with 4 witespaces
                builder.append(line.replaceFirst("\\s*", "    "));
            }
            else
            {
                builder.append(line);
            }
            // Check if line line finishes with { (And optionally with some whitespaces after it)
            if(line.matches(".*\\{\\s*")) checkNext = true;
            else checkNext = false;

            //Append line separator at the end of line
            builder.append(System.getProperty("line.separator"));
        }
        return builder.toString();
    }

}
Respondeu 01/03/2016 em 02:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more