Form ändern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Da du keine weiteren Angaben machst, weshalb du das umgeformt haben willst, geh ich einfach mal davon aus das dir der Code zu einfach ist. Kein Problem hier bekommst du ne Lösung mit so vielen Pattern wie möglich.

    Zuersteinmal brauchen wir einen Automat der bestimmt wann das gelesene zu Ende ist. Um den Automat definieren zu können brauchen wir erst einmal ein Interface für die Übergänge:

    Quellcode

    1. package butalive;
    2. public interface Transaction {
    3. public void readSeparator(Automat a);
    4. public void readChar(Automat a);
    5. }


    Als nächstes brauchen wir Zustände dabei implementieren wir die Übergänge von einem Zustand zum anderen

    Quellcode

    1. package butalive;
    2. public enum State implements Transaction{
    3. A
    4. {
    5. @Override
    6. public void readChar(Automat a) {
    7. a.setState(this);
    8. }
    9. @Override
    10. public void readSeparator(Automat a) {
    11. a.setState(B);
    12. }
    13. @Override
    14. public boolean isFinal()
    15. {
    16. return false;
    17. }
    18. },
    19. B
    20. {
    21. @Override
    22. public void readChar(Automat a) {
    23. throw new RuntimeException("Final State erreicht");
    24. }
    25. @Override
    26. public void readSeparator(Automat a) {
    27. throw new RuntimeException("Final State erreicht");
    28. }
    29. @Override
    30. public boolean isFinal() {
    31. return true;
    32. }
    33. };
    34. public abstract boolean isFinal();
    35. }
    Alles anzeigen


    Danach folgt der eigentliche Automat der die Zustände auswertet und zusammenhält:

    Quellcode

    1. package butalive;
    2. public class Automat {
    3. private State state = State.A;
    4. public void setState(State state) {
    5. this.state = state;
    6. }
    7. public void readChar()
    8. {
    9. state.readChar(this);
    10. }
    11. public void readSeparator()
    12. {
    13. state.readSeparator(this);
    14. }
    15. public boolean isFinal()
    16. {
    17. return state.isFinal();
    18. }
    19. }
    Alles anzeigen


    Bevor wir uns an den Parser machen können, brauchen wir etwas das definiert welcher Buchstabe als Trennzeichen definiert wird. Um so generisch wie möglich zu bleiben versteck ich das natürlich hinter einem Interface

    Quellcode

    1. package butalive;
    2. public interface ISeparator {
    3. public boolean isSeparator(char c);
    4. }


    Und hier die Implementierung für Whitespaces als Trenner

    Quellcode

    1. package butalive;
    2. public class WhitespaceSeparator
    3. implements ISeparator
    4. {
    5. @Override
    6. public boolean isSeparator(char c) {
    7. return Character.isWhitespace(c);
    8. }
    9. }


    So nun können wir uns an den Parser machen:

    Quellcode

    1. package butalive;
    2. import java.io.IOException;
    3. import java.io.InputStream;
    4. import java.io.InputStreamReader;
    5. import java.io.Reader;
    6. public class Parser {
    7. private Reader reader;
    8. private ISeparator separtor;
    9. public Parser(InputStream in, ISeparator separator)
    10. {
    11. reader = new InputStreamReader(in);
    12. this.separtor = separator;
    13. }
    14. public String parse() throws IOException
    15. {
    16. Automat a = new Automat();
    17. int read = -1;
    18. StringBuilder builder = new StringBuilder();
    19. while((read = reader.read())>=0 && !a.isFinal())
    20. {
    21. if(separtor.isSeparator((char)read))
    22. {
    23. a.readSeparator();
    24. }
    25. else
    26. {
    27. a.readChar();
    28. builder.append((char)read);
    29. }
    30. }
    31. return builder.toString();
    32. }
    33. }
    Alles anzeigen


    Ich könnte natürlich noch weiter mit Pattern um mich werfen, aber ganz abschrecken vom Programmieren will ich dich natürlich auch nicht. Mit diesem Code als Basis sieht dein Code nun so aus:

    Quellcode

    1. System.out.println(text);
    2. Parser p = new Parser(System.in, new WhitespaceSeparator());
    3. return p.parse();


    Wenn du deine Frage ein bisschen präziser stellst kann ich dir sicher noch besser helfen.

    mfg
    ButAlive