2010-11-21 30 views
0

Je fichier avec ce format spécifique:Lire un fichier au format spécifique dans ArrayList

 
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 
  • ligne 1 = état de départ
  • ligne 2 = accepter l'état
  • ligne 3 - n = transition Table
  • 1er rang = état dans
  • deuxième rang = état hors
  • A, B = symbo l

Comment mon FileReader en Java lire ces fichiers dans 5 différents ArrayList s (état de départ, état final, l'État en, état hors et symbole)?

Répondre

1

Vous pouvez utiliser la classe Scanner pour lire le fichier (nextLine() is highly recommended). Puisque vous connaissez les positions des éléments dont vous avez besoin, vous pouvez ensuite utiliser la méthode split pour analyser la chaîne d'entrée dans la liste ArrayList que vous aimez.

+0

Pourquoi pas un simple «BufferedReader»? – thejh

+0

pouvez-vous expliquer un peu plus? Je suis nouveau en Java – gin

+0

@thejh: Je ne comprends pas ce que vous voulez dire exactement. @gin: Vous savez que les 2 premières lignes du fichier sont l'état initial et l'état d'acceptation. En outre, vous savez que des lignes 3 à n, vous devez diviser les lignes en lignes. Donc, fondamentalement, faites une boucle while avec un compteur, et en fonction de la valeur du compteur, vous savez sur quelle ligne vous travaillez, ainsi vous pouvez remplir les arraylists en conséquence. S'il vous plaît jeter un oeil sur les liens que j'ai fournis pour obtenir une meilleure compréhension de la façon dont vous pouvez mettre en œuvre un tel système. – npinti

3

Il est préférable d'utiliser un Scanner ici:

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

Je pense que l'OP veut que la deuxième ligne devienne une liste d'états d'acceptation. – thejh

+0

@thejh: corrigé :) – dacwe

+0

est-ce qu'il a le même code si j'utilise 'in' et 'out' dans une chaîne plutôt qu'int? – gin

0

Jetez un oeil à la StringTokenizer, utilisez ArrayList s pour construire vos listes.

+0

De son javadoc: * StringTokenizer est une classe héritée qui est conservée pour des raisons de compatibilité bien que son utilisation soit déconseillée dans le nouveau code *. – BalusC