1

教科書からプログラムを変更する担当者がいます。プログラムはユーザーから入力文字列を受け取り、入力された単語数で応答します。私の割り当ては、これを変更して、単語数ではなく文字数を数えることです。これは正常に機能していますが、.splitを使用して文字をトークン化すると、配列の先頭にスペースが表示されます。誰かが理由を説明できますか?

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

/**
*
* @author Frank
*/
public class LetterCounting 
{
    public static void main( String[] args )
   {
      // create HashMap to store String keys and Integer values
      Map< String, Integer > myMap = new HashMap< String, Integer >(); 

      createMap( myMap ); // create map based on user input
      displayMap( myMap ); // display map content
   } // end main

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

      // tokenize the input
      String letters = input.replaceAll("\\s", "");
      String[] tokens = letters.split( "" );

      // processing input text 
      for ( String token : tokens ) 
      {
         String word = token.toLowerCase(); // get lowercase word

         // if the map contains the word
         if ( map.containsKey( word ) ) // is word in map
         {
            int count = map.get( word ); // get current count
            map.put( word, count + 1 ); // increment count
         } // end if
         else 
            map.put( word, 1 ); // add new word with a count of 1 to map
      } // end for
   } // end method createMap

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

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

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

      // generate output for each key in map
      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() );
   } // end method displayMap
} // end class WordTypeCount

NetBeansからのdubugデータのスクリーンキャプチャを持っていますが、それを投稿するのに十分な評判がありません。誰かがそれを見たいと思ったら私に知らせてください、そして私はあなたにそれを送ることができます。

ご入力いただきありがとうございます。

フランク

4

2 に答える 2

0

String.split()は、分割に正規表現を使用します。代わりに、 StringUtilsライブラリのsplitXYZ()メソッドの1つを使用できます。これは、文字列をセパレータとして使用し、はるかに予測可能な結果を​​生成します。

于 2012-10-04T18:29:01.350 に答える
0

replaceAll(regex, replacement)メソッドを試して、以下のような簡単なコードを書いてみませんか?

    Scanner scanner = new Scanner( System.in ); // create scanner
    System.out.println( "Enter a string:" ); // prompt for user input
    String inputString = scanner.nextLine();
    System.out.println(inputString);
    System.out.println(inputString.length());
    String truncatedString = inputString.replaceAll(" ", "");
    System.out.println(truncatedString);
    System.out.println(truncatedString.length());
于 2012-10-04T18:07:05.797 に答える