Comment formater ce texte? Java

voix
46

Alors , voici le problème. Transformez un fichier texte dans la mise en forme correcte. Le point du problème est que je dois lire un fichier, un fichier texte qui contient le code dans ce fichier texte. Le code qui a mauvais formatage. La question de la mise en forme est que quand il y a une accolade comme celui - ci {, la ligne suivante est pas 4 espaces à droite, il est juste tout à l'extrême gauche. Comme ça:

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

Quand il doit être le suivant:

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

Et il n'y a pas d'autres différences entre les 2. La seule règle est de faire simplement si chaque fois qu'il ya une accolade comme celui-ci {, pour vous assurer que la ligne suivante est de 4 espaces à droite. Et vice versa. Donc, chaque fois qu'il ya une accolade comme celui-ci}, la ligne suivante doit être de 4 espaces à gauche. J'espère que vous comprenez cela.

Ceci est ma question. J'ai appris comment faire un programme dans lequel un morceau de texte avec plusieurs espaces et les lignes se transforme en une seule ligne avec un espace unique à chaque fois. Était-ce pas trop dur.

Pour cela, cependant, je dois garder tout sur la même ligne. Donc , s'il y a 30 lignes, le nouveau programme que je fais est aussi 30 lignes. Je dois garder un espacement très similaire, mais la différence est simple , toute chose accolade. Donc , fondamentalement, je dois juste faire la ligne après une accolade soit 4 espaces à droite, puis faire la même chose il est à gauche 4 places si elle est une }accolade.

Alors, comment puis-je faire exactement? Je ne sais pas comment tout arranger cela sans gâcher d'autres choses. Il est une chose simple que je dois faire; juste faire les lignes suivantes les accolades 4 espaces à droite ou à gauche, mais je n'ai aucune idée ce que la syntaxe à utiliser pour y parvenir. Merci!

EDIT: Cela aurait pu tout simplement rendu plus facile. Donc, en gros, toutes les lignes soit se terminent par une accolade droite, une accolade gauche, ou un point-virgule. Peu importe ce que. Donc, chaque fois que l'un de ces pops up, il est la fin d'une ligne. Alors peut-être si vous savez comment cela rend plus facile, alors je suis juste vous laisser savoir.

Créé 29/02/2016 à 23:04
utilisateur
Dans d'autres langues...                            


3 réponses

voix
0

Il existe des programmes qui le fera automatiquement pour vous, afin que vous n'avez pas besoin de réinventer la roue. Par exemple, dans Eclipse, tapez: ctrl-a(sélectionner) ctrl-i(-indent automatique).

Créé 29/02/2016 à 23:43
source utilisateur

voix
0

Voici un pseudo-code, vous pouvez commencer par:

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

vous pourriez avoir besoin de traiter avec des accolades échappées et d'autres complications si

Créé 29/02/2016 à 23:54
source utilisateur

voix
0

Vous pouvez le faire assez facilement en utilisant des expressions régulières. Si vous ne connaissez pas et l'intention d'être un programmeur, puis apprendre certainement. Il permettra d'économiser pour vous beaucoup de temps à l'avenir.

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

}
Créé 01/03/2016 à 02:01
source utilisateur

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