2016-01-14 81 views
2

我正在嘗試使用哈希映射或hasTokens來創建一個表,以顯示具有相同長度的文件的多少個單詞的出現頻率。例如,一個長度爲2個字符的單詞可能會在整個文本中顯示5次。創建一個包含字長的頻率表

在.txt文件中最長的單詞是9個字母。如何設置我的代碼來分析文件,然後創建一個表格,輸出一個長度爲1-9個字符的單詞被發現多少次?

我已經試過了,而如創建一個循環:

for(int i= 0; i<word.length(); i++) 
     { 
     if (word.length()== 1) 
     { 
      System.out.println("The words with length of 1 are: " + i); 

     } 
    } 

但是它一直在無限的事情,但是當我刪除while循環失敗。希望有人能夠給我提供一些關於怎麼做的提示。 謝謝 Jeff

+0

是否有你不希望使用HashMap的理由嗎?下面的答案完全適合您的需求,但它使用散列表。 –

回答

0

如果我正確理解你,答案只是創建一個整數和索引的數組。這將是更快和更小:

final static int MIN_WORD_LENGTH=2; 
final static int MAX_WORD_LENGTH=9; 

int counts[MAX_WORD_LENGTH-MIN_WORD_LENGTH]; // allow for longer words :-) 

private void addWord(int length) { 
    if ((length >=2) && (length < MAX_WORD_LENGTH)) 
     counts[length-MIN_WORD_LENGTH]++; 
} 

我個人會使用更大的陣列,擺脫映射和邊界檢查。然後我會創建一個更高級的異常處理程序來捕捉任何超出範圍的東西。像這樣的: -

int counts[30]; // allow for longer words :-) 

private void addWord(int length) throws ArrayIndexOutOfBoundsException{ 
     counts[length]++; 
} 

幾個字節額外的存儲空間是不是最現代處理器的一個問題,你會節省更多的代碼大小。我想擺脫函數調用的爲好,它在這裏爲清楚起見

然後打印:

void printCounts() { 
    for(int i=0; i < 20; i++) { 
     if (counts[i] >0) 
      System.out.printline("There are " + counts[i] + " words of length" + i); 
    } 
} 
+0

非常感謝您的回覆和幫助。肯定幫了很多。但是,現在我試圖從整個文件.txt中分離出幾個選定的單詞,並將它們列出。例如,以大寫字母開頭並以「ed」結尾的單詞應從整個文件中取出並打印出來。我的方法是使用for循環來搜索整個文件中的所有字符,但我很難實現它來搜索大寫字母 } –

+0

嗨,傑夫,看看正則表達式,你可以找到這些字很容易用([AZ] [a-zA_Z] * [e] [d])等。 https://regex101.com/給你一個在線測試器來調整你的RE。 Java,python等可以用來搜索你的字符串,找到多次出現等等。他們可能是一個痛苦的寫作和調試:-) – ChrisR

0

您可以使用一個HashMap,長度爲Key,字數作爲值。例如。對於長度1-3(未測試):

List<String> words = Arrays.asList(new String[]{"aaa", "bbb", "x", "y", "rr", "tt"}); 
Map<Integer, Integer> map = new HashMap<Integer,Integer>(); 
map.put(1, 0); 
map.put(2, 0); 
map.put(3, 0); 
for(String word: words) { 
    int cnt = map.get(word.length()); 
    map.put(word.length(), ++cnt); 
} 
+0

這個方法幫助了很多,並且讓我更熟悉HashMap。非常感謝你。 –