0

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

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

在计算字母的频率之前,我已经尝试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仍将是“你好世界”

你会想要:

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

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

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

        ...
     }
  } 
于 2012-04-15T22:42:24.173 回答
0

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

于 2012-04-15T22:43:01.447 回答
0

@Kshitij Mehta 是正确的。

您的问题是通过设置不删除空格的组合

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

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

于 2012-04-15T23:18:12.370 回答
0
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());
  }
}

你可以试试这个。我知道你已经做到了。但我认为它会帮助别人。

于 2019-08-02T15:18:29.937 回答