2010-12-01 59 views
0

我有一段代碼,我只是不知道該怎麼處理。它應該顯示一個對話框來選擇一個文件,當文件被選中時,它會將結果輸出到一個直方圖中。我有一切工作,除了我不知道我需要把什麼變量作爲text2。Java幫助從文件讀取

private int[] countLetters2() 
{ 
    // Count for 26 letters 
    int[] count = new int[26]; 

    //get contents from file 
    chooser.showOpenDialog(null); 
    File f = chooser.getSelectedFile(); 

    try 
    { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 
    String s; 
    while((s = br.readLine()) != null) 
    { 
    System.out.println(s); <------simply to see if the reader and buffer were working 

    } 
    } 
    catch(IOException g) {} 


    String text2 = ; <------------------------------------this is the problem 

    //converts every letter to uppercase 
    text2 = text2.toUpperCase(); 

    //Count occurrence of each letter (case insensitive) 
    for (int i = 0; i < text2.length(); i++) 
    { 
    char character = text2.charAt(i); 

    if ((character >= 'A') && (character <= 'Z')) 
    { 
    count[(int)character - 65]++; // The ASCII for 'A' is 65 
    } 
    } 
    return count; // Return the count array 
+0

您是否試圖提供整個文件或每行的直方圖? – 2010-12-01 22:26:43

回答

0

只收集到您的while循環中的text2變量。

  String text2 = ""; 
      try { FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String s="" while((s = br.readLine()) != null) { 
text2+=s; 
ystem.out.println(s); 

      } } catch(IOException g) {} 

OR

String s = ""; 
      try { FileReader fr = new FileReader(f); 
      BufferedReader br = new BufferedReader(fr); 
      String tmp; 
      while((tmp = br.readLine()) != null) {    
       System.out.println(s); 
       s += tmp; 
      } } catch(IOException g) {} 

      text2=tmp; 
+0

s在循環後爲空。這將不起作用 – 2010-12-01 22:26:25

0

移動計數characgters到您打印線的循環的循環。像

private int[] countLetters2() 
{ 
    // Count for 26 letters 
    int[] count = new int[26]; 

    //get contents from file 
    chooser.showOpenDialog(null); 
    File f = chooser.getSelectedFile(); 

    try 
    { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 
    String s; 
    while((s = br.readLine()) != null) 
    { 
    System.out.println(s); 
    //converts every letter to uppercase 
    String text2 = s.toUpperCase(); 

    //Count occurrence of each letter (case insensitive) 
    for (int i = 0; i < text2.length(); i++) 
    { 
     char character = text2.charAt(i); 

     if ((character >= 'A') && (character <= 'Z')) 
     { 
     count[(int)character - 65]++; // The ASCII for 'A' is 65 
     } 
    } 
    } 
    } 
    catch(IOException g) {} 

    return count; 
} 
0

東西,我覺得這是毫無意義的使用BufferedReader去通過行的文件行,然後通過文字都要經過每行的字符。這是不必要的複雜和低效的,因爲你基本上只是想遍歷所有字符:這正是Reader給你的功能。

您可以大大簡化你的日常,如下所示:

[...] 

    BufferedReader br = new BufferedReader(fr); 
    for (int c; (c = br.read()) > -1;) { 
     char character = Character.toUpperCase((char) c); 

     if ((character >= 'A') && (character <= 'Z')) { 
      count[character - 'A']++; 
     } 
    } 
} catch (IOException g) { /* this is no good */ } 

return count; 

這樣,你得到完全擺脫text2,你的代碼是短,你的程序將運行得更快(如果衡量的),因爲一個不必要的建設字符串被丟棄。

P.S .:一個不相關的注意事項:確保處理用戶在文件選擇器對話框中單擊「取消」的情況。

P.P.S .:用戶是否會無意中在程序中選擇一個目錄而不是正確的文件?那麼會發生什麼?