0

クラスの宿題に取り組んでいて、ほとんどすべて解決しましたが、1 つの部分に苦労しています。

この割り当てでは、特定の文字列内の文字の出現頻度をカウントし、それらのマップをコンソールに出力するプログラムを作成することになっています。プログラムを作成しましたが、ほぼ正しく動作しますが、マップで空白を無視することはできません。2 種類の空白も見つけたようです。1 つは単語間の空白で、もう 1 つは私にはわかりません。

文字の頻度をカウントする前に空白を削除しよう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() );
   }
}
4

6 に答える 6

4

String.replaceAll動作するはずです。String.replaceAllを返すことに注意してくださいString。したがって、残りの計算を実行するには、返された文字列を使用する必要があります。

たとえば、次の場合:

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

myString引き続き「Hello World」

あなたが望むだろう:

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

その後myNewString、スペースはありません。

また、次を使用して文字の繰り返しを簡素化できます

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

これにより、追加の「空白がカウントされる」問題が修正されます。これは、 を呼び出すとmyString.split("")、返されるリストの最初の要素が "" (空の文字列) であるためです。

于 2012-04-15T22:44:35.097 に答える
1

myString.split("\\s+");すべての空白の削除と分割を同時に試みることができます。

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

  String input = scanner.nextLine();
  System.out.println("String: "+input);
  input = input.trim();
  String[] tokens = input.split("\\s+");
于 2012-04-15T22:39:39.663 に答える
0

@Kshitij Mehtaは正しいです。

あなたの問題は、設定によって空白を削除しないことの組み合わせです

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

また、2番目の問題は、Strings代わりにchar(およびマップの文字)を使用して文字(文字)を保存することでした。Java が予期せず実行されたのは、char に対する String の予期しない使用でした。

于 2012-04-15T23:18:12.370 に答える
0

または、Character.isLetter(char c)メソッドを使用して、文字が本当に文字かどうかを判断できます。

于 2012-04-15T22:43:01.447 に答える
0

の代替String.replaceAll:入力をフィルタリングして、アルファベット以外の文字をカウントする前に無視することができます (または、結果を出力する前にマップを同様にフィルタリングします)。例えば

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

        ...
     }
  } 
于 2012-04-15T22:42:24.173 に答える