2012-04-15 8 views
0

私はクラスの宿題を勉強していますが、ほとんどすべてを解決しましたが、1つの部分で苦労しています。文字列トークンを数えながらスペースを無視する

割り当てのために、与えられた文字列の文字の出現頻度を数え、そのマップをコンソールに出力するプログラムを書くことになっています。私はプログラムを書いて、それはほぼ正しく動作しますが、私は空白を無視するようにマップを取得することはできません。 2つの異なる種類の空白も見つかるようです。一つは単語と単語との間のスペースで、私は理解できません。

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

文字列の空白を置き換えるコードを参照してください。 –

答えて

4

String.replaceAllが有効です。 String.replaceAllStringを返します。だから、残りの計算を実行するには、それが返す文字列を使用する必要があります。例えば

、あなたが持っている場合:

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

myStringはまだ "Hello World" のだろう

あなたはしたいと思います:myNewStringには、スペースを持ちません

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

た後。

また、あなたはこれが問題をあなたの追加「にカウントされている空白を」修正します

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

を使用して、文字の繰り返しを簡略化することができます。これは、myString.split("")を呼び出すと、返されるリストの最初の要素が ""(空の文字列)であるためです。

+0

これは問題でした。新しい文字列を割り当てなければならないことは分かりませんでした。しかし、私はまだ説明できない空白を1つカウントしています。 – Speakr

+0

私の回答で指摘した反復技術を使用してください。追加の空白の数が表示されている理由を説明して答えを編集しました。 –

1

あなたは、同時にすべての空白とスプリットを取り除くためにmyString.split("\\s+");を試すことができます。

@Kshitij Mehtaが指摘しているように、そのメソッドの戻り値を必ず使用してください。だからあなたのコードは次のようになります。

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

少し高価なすべてのトークンで使用する必要があります。 –

+0

良い点。私はあなたのように見えるように私の答えを更新しました。 –

0

代替String.replaceAllに:あなたはfilter your inputはそれらをカウントする前に、すべての非アルファベット文字を無視(または結果を印刷する前に、同様にあなたのマップをフィルタリング)することができます。例えば。

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

     ... 
    } 
    } 
0

また、あなたはキャラクターが本当に文字であるかどうかを判断するためにCharacter.isLetter(char c)メソッドを使用することができます。

0

@Kshitij Mehtaが正しいです。

あなたの問題はまた、あなたの第二の問題は、(文字です)の文字を保存するために(あなたのマップのためと文字)の代わりにcharStringsを使用していた

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

を設定することにより、空白を除去しない組み合わせです。 Javaを予期せずに実行させるのは、文字列の予期せぬ使用です。

関連する問題