2010-11-21 9 views
0

I Datei mit diesem spezifischen Format haben:Lesen einer Datei in bestimmten Format in Array

 
0 
2 4 
0 1 A 
0 5 B 
1 1 A 
1 3 B 
2 6 A 
2 4 B 
3 6 A 
3 4 B 
4 6 A 
4 4 B 
5 1 A 
5 5 B 
6 6 A 
6 2 B 
  • Zeile 1 = Startzustand
  • Zeile 2 = state
  • Leitung 3 annehmen - n = Übergangs Tabelle
  • 1. Reihe = state in
  • 2. Reihe = state out
  • A, B = symbo l

Wie kann meine FileReader in Java diese Datei in 5 verschiedenen ArrayList s lesen (Startzustand, Endzustand Zustand in, Zustand und Symbol)?

Antwort

1

Sie können die Klasse Scanner verwenden, um die Datei zu lesen (nextLine() is highly recommended). Da Sie die Positionen der Elemente kennen, die Sie benötigen, können Sie dann die split-Methode verwenden, um die Eingabezeichenfolge in jeder beliebigen ArrayList zu analysieren.

+0

Warum nicht ein einfacher 'BufferedReader'? – thejh

+0

können Sie ein bisschen mehr erklären? Ich bin neu in Java – gin

+0

@thejh: Ich verstehe nicht, was meinst du genau. @gin: Sie wissen, dass die ersten beiden Zeilen der Datei der Startzustand und der Akzeptanzstatus sind. Außerdem wissen Sie, dass Sie die Zeilen von Zeile 3 bis Zeile n in Zeilen aufteilen müssen. Machen Sie also im Grunde eine while-Schleife mit einem Zähler, und abhängig vom Wert des Zählers wissen Sie, in welcher Zeile Sie arbeiten. Sie können die Arraylisten entsprechend füllen. Bitte werfen Sie einen Blick auf die Links, die ich zur Verfügung gestellt habe, um besser zu verstehen, wie Sie ein solches System implementieren können. – npinti

3

Am besten ist es ein Scanner hier verwenden:

static class State { 
    int in; 
    int out; 
    String symbol; 

    State(int in, int out, String symbol) { 
     this.in = in; 
     this.out = out; 
     this.symbol = symbol; 
    } 

    @Override 
    public String toString() { 
     return in + " " + out + " " + symbol; 
    } 
} 

public static void main(String[] args) throws FileNotFoundException { 

    Scanner s = new Scanner(new File("input.txt")); 

    int startState = Integer.parseInt(s.nextLine()); 
    List<Integer> acceptStates = new LinkedList<Integer>(); 
    List<State> states = new LinkedList<State>(); 

    Scanner st = new Scanner(s.nextLine()); 
    while (st.hasNextInt()) 
     acceptStates.add(st.nextInt()); 

    while (s.hasNextInt()) 
     states.add(new State(s.nextInt(), s.nextInt(), s.next())); 

    System.out.println(startState); 
    System.out.println(acceptStates); 
    System.out.println(states); 

    // logic... 
} 
+0

Ich denke, dass das OP will, dass die zweite Zeile eine Liste von akzeptierten Zuständen wird. – thejh

+0

@thejh: fixed :) – dacwe

+0

ist es der gleiche Code, wenn ich 'in' und 'out' in String anstelle von int verwende? – gin

0

Werfen Sie einen Blick auf die StringTokenizer, verwenden ArrayList s Ihre Listen aufzubauen.

+0

Aus seinem Javadoc: * StringTokenizer ist eine Legacy-Klasse, die aus Kompatibilitätsgründen beibehalten wird, obwohl ihre Verwendung in neuem Code * nicht empfohlen wird. – BalusC