java - HashMap以小数形式打印字母频率?
问题描述
我有这个代码:
public String LetterFreq(String t) {
HashMap<Character,Double> map= new HashMap<Character, Double>();
for(int i=0;i< t.length();i++) {
char c= t.charAt(i);
Double val = map.get(c);
if(val!= null) {
map.put(c,new Double(val +1));
}
else {
map.put(c, 1.0);
}
}
for (Entry<Character, Double> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + (entry.getValue()/t.length()));
}
在此代码中,它遍历我给出的字符串的每个字母,并将计数映射到键,如果有多个字母则递增。此外,在打印行时,它会将数字(计数)除以整个字符串的长度。我遇到的问题是,当我在里面输入文本时,我希望输出看起来像这样:
letter: decimalvalue
letter: decimalvalue
但我得到了这个:
: decimal value
letter: decimavalue
letter:decimalvalue...
一些变化,无论我有一个没有字母的空格,它都会给出一个十进制值,我不明白为什么?
更新:
我假设这与字符串中的空格有关,但是当我一起输入文本时,就像thisisjulz
我们在这里看到的那样,字母 s 出现了 2/10,这应该意味着 .2 但我的代码甚至在我没有的空格中注册了空格'不要像上面引用的示例中看到的那样放置并将其计为 1 个字符空间。有什么方法可以实现分隔符或其他东西来确保它只计算具有值的字符?
Updatev2:这是我从中获取“字符串 t”的地方,以及这一切是如何结合在一起的:alice 将我输入到控制台的值发送给 eve,而 Eve 函数所做的所有事情都是 LetterFreq(tex);
public void Alice()
{
System.out.println("Would you like to encrpyt a message or quit?");
System.out.println("To Encrypt press enter 9.");
System.out.println("If you wish to quit enter 0.");
System.out.println("If you made a mistake and want to go back to the main menu press 7.");
Scanner q = new Scanner(System.in);
switch (q.nextInt())
{
case 0:
System.out.println ("Thank you and goodbye.");
break;
case 9:
System.out.println ("Please enter text:");
String tex ="";
String line;
while (in.hasNextLine()) {
line = in.nextLine();
if (line.isEmpty()) {
break;
}
tex += line + "\n";
}
tex= Encryption(tex);
System.out.println(tex+"\n");
System.out.println("Would you like to simulate Bob Or Eve? ");
System.out.println("Enter 5 for Bob, 6 For Eve");
in.hasNextInt();
if(in.nextInt()==5) {
tex= tex.replaceAll(" ", "");
Bob(tex);
}
if (in.nextInt()==6) {
tex= tex.replaceAll(" ", "");
Eve(tex);
}
else {
break;
}
case 7:
new Menu();
default:
System.err.println ( "Unrecognized option" );
break;
}
解决方案
这是一个使用正则表达式和 replaceAll(...) 的完整示例。此外,我更新了您的代码以使用 containsKey(c) 而不是获取并检查获取的值是否为空。它更优雅一些。
package eu.webfarmr;
import java.util.HashMap;
import java.util.Map.Entry;
public class LetterFrequency {
public static void main(String[] args) {
letterFreq("Some Example 38 sdf %");
}
public static void letterFreq(String t) {
t = t.replaceAll("[^a-zA-Z]", "");
HashMap<Character, Double> map = new HashMap<Character, Double>();
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
if (map.containsKey(c)) {
Double d = map.get(c);
d++;
map.put(c, d);
} else {
map.put(c, 1.0);
}
}
for (Entry<Character, Double> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + (entry.getValue() / t.length()));
}
}
}
从 Java 8 开始,实际上有一个简洁的 map 函数,您可以使用它来进一步压缩代码:map.merge(c, 1.0, Double::sum);
. 请参阅下面的片段。本质上,如果不存在值,则将其设置为 1,否则递增。
public static void letterFreq(String t) {
t = t.replaceAll("[^a-zA-Z]", "");
HashMap<Character, Double> map = new HashMap<Character, Double>();
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
map.merge(c, 1.0, Double::sum);
}
}
推荐阅读
- gravity-forms-plugin - 如何使用 wordpress 重力形式的 curl 使用 Bearer 令牌授权垂直响应
- java - HttpSession Junit 测试
- mysql - 尝试从 MySql 中的相关表中更新列
- api - 查询参数在 GraphQL 中传播
- javascript - angularjs中div的多选和单选
- string - sed 替换一个字符串
- windows - 识别给定的计算机域(如果他们有 Skype for Business 应用程序)
- excel - 如何让变量与循环函数excel一起移动?
- python - 如何使用python修复特定查询以使用分页
- encryption - wso2 6.5.0 中是否有任何本机可用组件用于文件加密和解密?