【问题标题】:Ignoring spaces while counting String tokens在计算字符串标记时忽略空格
【发布时间】:2012-04-15 22:36:20
【问题描述】:

我正在为一个班级做家庭作业,我已经解决了几乎所有的问题,但我正在努力解决一个问题。

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

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

【问题讨论】:

  • 让我们看看你的代码试图替换字符串中的空格

标签: java string map


【解决方案1】:

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

【讨论】:

  • 这就是问题所在。我没有意识到你必须分配一个新的字符串。虽然,我仍然得到一个无法解释的空格。
  • 使用我在回复中指出的迭代技术。我通过添加解释来编辑我的答案,说明为什么您会看到额外的空白计数。
【解决方案2】:

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

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

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

【讨论】:

  • 他将不得不在所有代币上使用它,这有点贵。
【解决方案3】:

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

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

        ...
     }
  } 

【讨论】:

    【解决方案4】:

    或者,你可以使用Character.isLetter(char c)方法来判断一个字符是否真的是一个字母。

    【讨论】:

      【解决方案5】:

      @Kshitij Mehta 是正确的。

      您的问题是没有通过设置删除空格

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

      另外,您的第二个问题是使用Strings 而不是char (以及您的地图的字符)来保存字母(它们是字符)。只是对 char 的 String 的意外使用使 java 执行异常。

      【讨论】:

        【解决方案6】:
        import java.util.*;
        
        public class M {
          public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            s.toCharArray();
            String n = s.replaceAll(" ","");
            System.out.println(n.length());
          }
        }
        

        你可以试试这个。我知道你已经做到了。但我认为它会对其他人有所帮助。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多