我正在为一堂课做一份家庭作业,我几乎解决了所有这些问题,但我正在努力解决一个问题。
对于赋值,我们应该编写一个程序来计算任何给定字符串中字母的出现频率,然后将它们的映射打印到控制台。我编写了程序,它几乎正常工作,但我不能让地图忽略空格。它似乎也找到了两种不同的空白,一种是单词之间的空间,另一种是我无法弄清楚的。
我已经尝试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() );
}
}
答案 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")
您可以尝试一下。我知道你已经做到了。但是我认为这会帮助别人。