2012-04-15 44 views
0

我正在爲一個班級完成家庭作業,我已經解決了幾乎所有的問題,但我正在努力完成一個部分。計數時忽略空格字符串標記

對於作業,我們應該編寫一個程序來計算任何給定字符串中字母出現的頻率,然後將它們的地圖打印出來,並將其映射到控制檯。我已經編寫了程序,它幾乎可以正常工作,但我無法讓地圖忽略空白。它似乎也發現了兩種不同的空白,一種是詞語與另一種詞語之間的空白,我無法弄清楚。

我試過myString.replaceAll(" ", "");myString.trim();在計算字母的頻率之前試圖消除空白,但它仍然每次都計算兩種類型的空白。

任何見解或幫助表示讚賞。我可以這樣做,但我不喜歡一半的項目。下面是代碼:

import java.util.*; 

public class LetterFrequency { 
    public static void main(String[] args) { 

     Map< String, Integer > myMap = new HashMap< String, Integer >(); 

     createMap(myMap); 
     displayMap(myMap); 
    } 


    private static void createMap(Map< String, Integer > map) { 
     Scanner scanner = new Scanner(System.in); 
     System.out.println("Enter a string:"); 
     String input = scanner.nextLine(); 

     System.out.println("String: "+input); 

     String[] tokens = input.split(""); 


     for (String token : tokens) { 
     String letter = token.toLowerCase(); 


     if (map.containsKey(letter)) { 
      int count = map.get(letter); 
      map.put(letter, count + 1); 
     } 
     else 
      map.put(letter, 1); 
     } 
    } 


    private static void displayMap(Map< String, Integer > map) {  
     Set<String> keys = map.keySet(); 


     TreeSet<String> sortedKeys = new TreeSet<String>(keys); 

     System.out.println("\nMap contains:\nKey\t\tValue"); 


     for (String key : sortedKeys) 
     System.out.printf("%-10s%10s\n", key, map.get(key)); 

     System.out.printf( 
     "\nsize: %d\nisEmpty: %b\n", map.size(), map.isEmpty()); 
    } 
} 
+0

讓我們看看你的代碼試圖替換字符串中的空格 – 2012-04-15 22:42:07

回答

4

String.replaceAll應該工作。請記住,String.replaceAll返回String。所以你必須使用它返回的字符串來執行剩餘的計算。

舉例來說,如果您有:

String myString = "hello world"; 
myString.replaceAll(" ", ""); 

myString仍然是 「世界你好」

你會想:

String myNewString = myString.replaceAll(" ", ""); 

之後myNewString將沒有任何空間。

另外,還可以通過使用

for (int i = 0; i < input.length(); i++){ 
    char letter = input.charAt(i); 

這將解決您的附加簡化你的性格迭代「空白被計數」的問題。這是因爲當您調用myString.split("")時,返回列表中的第一個元素是「」(一個空字符串)。

+0

這是問題所在。我沒有意識到你必須分配一個新的字符串。儘管如此,我仍然得到一個無法解釋的空白。 – Speakr 2012-04-15 22:49:08

+0

使用我在我的回覆中指出的迭代技術。我通過添加一個解釋爲什麼你看到一個額外的空白計數編輯我的答案。 – 2012-04-15 22:56:54

1

你可以嘗試myString.split("\\s+");在同一時間擺脫所有空白和分裂。

正如@Kshitij Mehta指出的,確保您使用該方法的返回值。所以,你的代碼應該是這樣的:

String input = scanner.nextLine(); 
    System.out.println("String: "+input); 
    input = input.trim(); 
    String[] tokens = input.split("\\s+"); 
+0

他必須在所有令牌上使用它,這有點貴。 – 2012-04-15 22:49:55

+0

好點。我已經更新了我的答案,看起來更像你的答案。 – 2012-04-15 22:58:31

0

替代String.replaceAll:您可以filter your input忽略計數之前的任何非字母字符(或打印結果之前類似的過濾你的地圖)。例如。

for (String token : tokens) { 
    if (Character.isLetter(token)) { 
     String letter = token.toLowerCase(); 

     ... 
    } 
    } 
0

@Kshitij Mehta是正確的。

你的問題是通過設置

input = input.replace(" ", ""); 

而且,你的第二個問題是使用Strings代替char(和字符爲您的地圖)保存信件(這是個字符)不刪除空格的組合。這只是String的意外使用,使得java意外執行。