3 回答
TA贡献1846条经验 获得超7个赞
那一行:
if (map.containsValue(data)) ...
那不是你想要的。您从文件中读取一个字节,并且想知道该字节是否已存储。作为关键,而不是价值!
因此你需要相应的逻辑,像这样:
int counterForData = 0; if (map.contains(data)) { counterForData = map.get(data); } map.put(data, counterForData+1);
意思是:你的键是“数据字节”,你的值是相应的频率。
当该代码有效时,您可以开始考虑编写更少的代码,例如使用computeIfAbsent()map.getOrDefault()
甚至更好!
TA贡献1872条经验 获得超3个赞
containsKey
将是正确的方法 iocontainsValue
。available
给出可以从缓冲输入中读取多少字节,而不会阻塞等待物理读取。这意味着当低级 I/O 缓冲区为空时,仍然可能有数据。解决方案是让代码“阻塞”,等待下一次物理读取。结果:所有具有最大计数的字节都需要遍历 >= 或 == max。
因此:
Map<Byte, Integer> map = new HashMap<>();
int maxCount = 0;
//byte maxByte = 0;
int data;
while ((data = inputStream.read()) >= 0) {
byte b = (byte)data;
int count = map.getOrDefault(b, 0) + 1;
map.put(b, count);
if (count > maxCount) {
maxCount = count;
//maxByte = b;
}
}
for (Map.Entry<Integer, Integer> entry : map.entrySet()){
if (entry.getValue() == maxCount) {
System.out.print(entry.getKey() + "\t");
}
}
System.out.println();
TA贡献1801条经验 获得超8个赞
这条线...
if (map.containsValue(data)) map.replace(data, map.get(data) + 1); else map.put(data, 1);
检查地图是否已经包含值(它不会因为你的地图是空的)。您想要增加数据的数量(如果存在)或添加数据(如果尚不存在)。为此,请将上面的代码片段替换为...
map.compute(data, (k, v) -> (v == null) ? 1 : v + 1);
这会将新数据添加为[data, 1]
并将现有数据更新为[data, previous value + 1]
. 如果你使用这个,你应该阅读有关compute
功能
添加回答
举报