2010-11-21 56 views
0

我有與此特定格式的文件:閱讀特定格式的文件轉換成的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 
  • 線1 =啓動狀態
  • 線2 =接受狀態
  • 線3 - N =過渡表
  • 第一行=狀態
  • 第二行=狀態出
  • A,B =個符號升

如何我FileReader在Java中讀取這些文件到5角不同的ArrayList秒(在啓動狀態,最終狀態,狀態,狀態出和符號)?

回答

1

您可以使用Scanner類讀取文件(nextLine() is highly recommended)。由於您知道所需項目的位置,因此您可以使用split方法來解析您喜歡的ArrayList中的輸入字符串。

+0

爲什麼不是一個簡單的'BufferedReader'? – thejh 2010-11-21 12:44:50

+0

你能多解釋一下嗎?我是新來的java – gin 2010-11-21 12:45:16

+0

@thejh:我不明白你的意思到底是什麼。 @gin:你知道文件的前兩行是開始狀態和接受狀態。另外,你知道從第3行到第n行,你需要將行分成幾行。所以基本上,用計數器做一段時間循環,根據計數器的值,你知道你在哪一行工作,因此你可以相應地填入數組列表。請看看我提供的鏈接,以更好地瞭解如何實現此類系統。 – npinti 2010-11-21 13:02:02

3

這是最好使用Scanner這裏:

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

我認爲OP希望第二行成爲接受狀態列表。 – thejh 2010-11-21 12:47:56

+0

@thejh:固定:) – dacwe 2010-11-21 12:56:11

+0

它是否具有相同的代碼,如果我在字符串中使用'in'和'out'而不是int? – gin 2010-11-21 13:01:03

0

有一個看StringTokenizer,使用ArrayList s到建立你的名單。

+0

從它的javadoc:* StringTokenizer是一個遺留類,由於兼容性的原因而被保留,儘管它在新代碼*中的使用不受歡迎。 – BalusC 2010-11-21 13:04:09