计算字符串标记时忽略空格

时间:2012-04-15 22:36:21

标签: java string map

我正在为一堂课做一份家庭作业,我几乎解决了所有这些问题,但我正在努力解决一个问题。

对于赋值,我们应该编写一个程序来计算任何给定字符串中字母的出现频率,然后将它们的映射打印到控制台。我编写了程序,它几乎正常工作,但我不能让地图忽略空格。它似乎也找到了两种不同的空白,一种是单词之间的空间,另一种是我无法弄清楚的。

我已经尝试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() );
   }
}

6 个答案:

答案 0 :(得分: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("")时,返回列表中的第一个元素是“”(空字符串)。

答案 1 :(得分:1)

您可以尝试myString.split("\\s+");删除所有空格并同时拆分。

正如@Kshitij Mehta指出的那样,请确保使用该方法的返回值。所以你的代码看起来像这样:

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

答案 2 :(得分:0)

String.replaceAll的替代方案:您可以filter your input在计算之前忽略任何非字母字符(或在打印结果之前类似地过滤地图)。 E.g。

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

        ...
     }
  } 

答案 3 :(得分:0)

或者,您可以使用Character.isLetter(char c)方法确定某个字符是否真的是一个字母。

答案 4 :(得分:0)

@Kshitij Mehta是对的。

您的问题是不通过设置

删除空白的组合
input = input.replace(" ", "");

此外,您的第二个问题是使用Strings代替char(以及地图的字符)来保存字母(字符)。这只是字符串意外地使用了char,这使得Java意外地执行。

答案 5 :(得分:0)

sTempPath = Environ$("Temp")

您可以尝试一下。我知道你已经做到了。但是我认为这会帮助别人。