2012-04-08 86 views
0

我正在寫一個讀取給定文件的頻率計數器,返回文件中每個字母的頻率(以百分比表示)。我到目前爲止的代碼讀取文件並列出文件中出現的每個字母的計數。我無法弄清楚如何組合所有計數來生成百分比。以下是我的代碼,如果我沒有正確使用代碼塊,請原諒。仍在學習所有這些東西。Java:結合數組中的計數以獲得百分比

import java.io.File; 
import java.util.*; 

public class FrequencyCounter 
{ 

    public static void main(String[] args) 
    { 
     char[] capital = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K', 'L', 'M', 'N', 
       'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; 

     char[] small = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
       'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; 

     Scanner scan; 
     try 
     { 
      scan = new Scanner(new File("c://Users//Mikel//Desktop//School Work//CIS407//Week1//mary.txt")); 
     } 

     catch (Exception e) 
     { 
      System.out.println("File not found"); 
      return; 
     } 

     int[] count = new int[26]; 



     while(scan.hasNextLine()) 
     { 
      String line = scan.nextLine(); 
      System.out.println("Line read: " + line); 
      char[] digit = line.toCharArray(); 


      for(int i = 0; i < digit.length; i++) 
      { 
       for(int j = 0; j < 26; j++) 
       { 
        if(digit[i] == capital[j] || digit[i] == small[j]) 
        { 
         count[j]++; 
         break; 
        } 
       } 
      } 
     } 


     for (int i = 0; i < 26; i++) 
     { 
      System.out.print(" " + capital[i]); 
      System.out.println("   " + (count[i])); 

     } 

    } 
} 

回答

0

有很多方法可以做到這一點。正如你所指出的,下一步就是拿出總數。這意味着循環兩個數組並將總數存儲在一個單獨的變量中。從那裏你可以將總數除以每個計數以得到一個百分比。

換句話說,您需要兩個更多的循環來完成任務。

你也可以考慮把代碼分解成方法。就是每一個循環,因此讀起來更像是:

countLetters(); 
calculateTotal(); 
printPercentages(); 

此外,您還可以使代碼更簡單。你可以調用Character.toLowerCase(digit [i])來得到小寫字母[只需要處理一個],而不是從0到25循環並檢查它是否相等。然後你可以從你的字母中減去'a'來得到索引而不用26個字符的數組。

1

通過觀察ch - 'a'是一個返回小寫字母的索引的整數表達式,並且ch - 'A'對大寫字母做同樣的事情,可以簡化您的代碼。所以嵌套循環和大小寫數組不是必需的。你可以通過調用Char.isUpperCase(ch)Char.isLowerCase(ch)來判斷一個字符是大寫還是小寫。

您可以通過添加了所有罪名,並計算百分比通常的方式得到的百分比:

double pct = (count[i]*100.0)/total;