为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 java 中查找映射中某个值的出现次数

如何在 java 中查找映射中某个值的出现次数

米琪卡哇伊 2023-04-19 15:48:08
从控制台输入文件名。查找具有最大重复次数的一个或多个字节。在屏幕上显示它们,以空格分隔。关闭 IO 流。如何解决这个任务?    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));    String fileName = reader.readLine();    FileInputStream inputStream = new FileInputStream(fileName);    Map<Integer, Integer> map = new HashMap<>();    int data;    Integer max = 0;    while (inputStream.available() > 0) {        data = inputStream.read();        if (map.containsValue(data)) map.replace(data, map.get(data) + 1);        else map.put(data, 1);        if (map.get(data) > max) max = map.get(data);    }        inputStream.close();    for (Map.Entry<Integer, Integer> entry : map.entrySet()){        if(entry.getValue() > max) {            System.out.print(entry.getKey() + "/t");        }    }    }}
查看完整描述

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()甚至更好!


查看完整回答
反对 回复 2023-04-19
?
守着一只汪

TA贡献1872条经验 获得超3个赞

  • containsKey将是正确的方法 io containsValue

  • 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();


查看完整回答
反对 回复 2023-04-19
?
蝴蝶刀刀

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功能


查看完整回答
反对 回复 2023-04-19
  • 3 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信