2016-04-24 97 views
0

嘿,大家我是新來的java,我正在爲我的Java類的介紹做一個獎金分配,我想知道是否有人可以幫助指導我的獎金問題:我只需要一個起點點!謝謝你的幫助!令牌計數令牌長度

這是分配的原始要求:

1)接受一個參數,對於輸入文件來處理的名稱的字符串的構造方法。完成 2)名爲processFile()的函數,它不接受任何參數,並拋出IOException。該函數必須讀取輸入文件的內容並計算每個令牌(字)在文件中存在的次數。成員變量HashMap是一個很好的類。 3)getFileName()函數,無參數,返回一個包含輸入文件名的字符串。 4)getTokenCount()函數,無參數,返回一個int,它是輸入文件中的標記(字)的總數。 5)一個getTokenCount()函數,它接受一個String參數,並返回令牌(字)出現在輸入文件中的次數。 6)一個接受int參數(count)的getTokensHavingCount()函數,並返回一個String的ArrayList,其中這些Strings是在輸入文件中顯示爲「count」次數的令牌。 7)一個getTokensHavingLength()函數,它接受一個int參數(長度),並返回一個ArrayListof字符串,其中這些字符串是輸入文件中具有該確切長度的標記。 8)getAverageOfCounts()函數(不帶參數)返回令牌計數的平均值。

由於這是代碼我到目前爲止,

import java.io.*; 

public class Assignment4 { 
// Your member variables go here 
    private String filename; 
    private int wordcount; // ? 
    private Map<String, Integer> freq = new HashMap<>(); // <Key,Value> 


    public Assignment4(final String fileName) { 
     this.filename = fileName; 
    } 

    public void processFile() throws IOException { 
     File file = new File(filename); 
     BufferedReader reader; 

     try { 
      FileReader fileReader = new FileReader(file); 
      reader = new BufferedReader(fileReader); 
      file = null; 

      String text = ""; 
      String line = reader.readLine();  
      while (line != null) { 
       text = text + line + " "; 
       line = reader.readLine(); 
      } 

      StringTokenizer st = new StringTokenizer(text); 
      wordcount = st.countTokens(); 
     } 

    } 

    public String getFileName() { 
     return filename; 
    } 

    public int getTokenCount() { 
     return freq.size; 
    } 

    public int getTokenCount(final String key) { 
     return freq.get(key); 
    } 

    public ArrayList<String> getTokensHavingCount(final int count) { 

     ArrayList<String> wordCount = new ArrayList<String>(); 

     Set<String> set = freq.keySet(); 
     for (String word : set) { 
      int noOfTimes = freq.get(word); 
      if (noOfTimes == count) 
       freq.add(word); 
     } 
     return wordCount; 
    } 

    public ArrayList<String> getTokensHavingLength(final int length) { 

     ArrayList<String> wordlength = new ArrayList<String>(); 

     Set<String> set = freq.keySet(); 
     for (String word : set) { 
      if (word.length() == length) 
       wordlength.add(word); 
     } 

     return wordlength;  
    } 

    public int getCountOfTokensHavingCount(final int count) { 
     return getTokensHavingCount(count).size(); 
    } 

    public int getCountOfTokensHavingLength(final int length) { 
     return getTokenHavingLength(count).size; 
    } 

    public double getAverageOfCounts() { 

     ArrayList<String> wordlength = new ArrayList<String>(); 
     double sum = 0.0d; 
     Set<String> set = freq.keySet(); 
     for (String word : set) { 
      sum += freq.get(word); 
     } 
     return sum/(double) freq.size(); 
    } 
} 

紅利#1:添加一個名爲getCountOfTokensHavingCount()函數,它接受一個int參數(計數),並返回其出現的令牌的數量在輸入文件中完全「計數」次。獎勵#2:添加一個名爲getCountOfTokensHavingLength()的函數,該函數接受一個int參數(長度),並返回出現在輸入文件中標記中具有完全「長度」字符的標記的數量。

+3

「添加一個函數...」我們向函數中添加了什麼?如果不知道這一點就不可能回答,例如你引用一個「輸入文件」和「令牌」,但不要提供關於當前如何獲得的細節。 –

+0

請給我們你已經有的完整代碼。你似乎正在處理文件。沒有你使用的所有課程的完整代碼,沒有人可以幫助你。 –

+0

提示#1:'Map '。 –

回答

0

好吧,幾件事。

  • 您的功能processFile不應該做它應該做的事情。你的任務是計算每個單詞在文本中出現的頻率。想法:逐字閱讀文件(看看java.util.Scanner);如果該單詞不在您的HashMap中,則將該單詞添加爲密鑰,將數字1添加爲該值;如果該單詞已在您的HashMap中,則將該值增加1。
  • 爲什麼在processFile中設置file = null?您應該正確關閉BufferedReader,而不是使用finally。 Java實際上可以自動爲你做到這一點:try(FileReader freader = new FileReader(file); BufferedReader breader = new BufferedReader(freader)) { // Your actual code }
  • 你的getTokenCount函數應該返回freq.size()(你調用一個函數,而不是一個屬性!)。
  • 也請使用總是大括號後的一個if或循環,無論你只做了一件事還是一個巨大的代碼塊。
+0

你的try-with-resources不能很好地清理:如果在構造'BufferedReader'時引發了一個異常,'FileReader'沒有關閉。它應該在一個單獨的初始化語句中:'try(A a = new A(); B b = new B(a)){' –