我的问题是为什么我不能让HASHMAP从多行计算重复的字符,而是输出每个字的字符数,请参阅文本示例:
我们从哪里开始
我认为是城镇之城
中午十二点
import java.io.*;
import java.util.*;
public class DupChar{
public static void main(String[] args){
try
{
File f = new File("C:/JavaPrograms/text.txt");
Scanner s = new Scanner(f);
while (s.hasNextLine()) {
String line = s.next();
String lineArr = line.replaceAll("\t", "");
HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();
char[] arr = lineArr.toCharArray();
for (char value: arr) {
if (Character.isAlphabetic(value)) {
if (charMap.containsKey(value)) {
charMap.put(value, charMap.get(value) + 1);
} else {
charMap.put(value, 1);
}
}
}
System.out.println(charMap);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的输出是,而不是我想要的:
{e = 1,H = 1}
{r = 1,e = 2,w = 1,h = 1}
{d = 1,o = 1}
{e = 1,w = 1}
等
答案 0 :(得分:0)
更改
String line = s.next();
到
String line = s.nextLine();
其他可能性:
Map<Character, Integer> charMap = new HashMap<>();
而
if (charMap.containsKey(value)) {
charMap.put(value, charMap.get(value) + 1);
} else {
charMap.put(value, 1);
}
简单地
//charMap.merge(value, 1, (oldv, newv) -> oldv + 1);
charMap.merge(value, 1, Integer::sum);
五个最常见的条目
让我们使用java Stream;因为那是集合的时髦“查询语言”。
charMap.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry<Character, Integer>::getValue).reversed())
.limit(5)
.forEach(entry -> System.out.printf("'%c' : %d%n", entry.getKey(), entry.getValue()));
以上按降序频率排序。
不幸的是,对于具有相同频率的字符,这变得更加精细。
在字母上排序将是:
charMap.entrySet().stream()
.sorted(Comparator.comparing(Map.Entry<Character, Integer>::getValue).reversed())
.limit(5)
.sorted(Comparator.comparing(Map.Entry<Character, Integer>::getKey))
.forEach(entry -> System.out.printf("'%c' : %d%n", entry.getKey(), entry.getValue()));
获取2个最高频率,并显示具有这些频率的所有字符:
import java.util.Map.Entry;
charMap.entrySet().stream()
.collect(Collectors.groupingBy(Entry<Character, Integer>::getValue))
.entrySet()
.stream()
.sorted(Comparator.comparing(
Entry<Integer, List<Entry<Character, Integer>>>::getKey)
.reversed())
.limit(2) // To highest frequencies
.map(e -> e.getValue())
.flatMap(List<Entry<Character, Integer>>::stream)
.sorted(Comparator.comparing(Entry<Character, Integer>::getKey))
.forEach(entry -> System.out.printf("# '%c' : %d%n",
entry.getKey(), entry.getValue()));
这已经变得难以阅读。
答案 1 :(得分:0)
如果覆盖该键的值
,则HashMap不会保留重复值