猿问

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

从控制台输入文件名。查找具有最大重复次数的一个或多个字节。在屏幕上显示它们,以空格分隔。关闭 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");

        }

    }


    }

}


米琪卡哇伊
浏览 122回答 3
3回答

喵喵时光机

那一行:if (map.containsValue(data)) ...那不是你想要的。您从文件中读取一个字节,并且想知道该字节是否已存储。作为关键,而不是价值!因此你需要相应的逻辑,像这样:int counterForData = 0; if (map.contains(data)) {   counterForData = map.get(data); }  map.put(data, counterForData+1);意思是:你的键是“数据字节”,你的值是相应的频率。当该代码有效时,您可以开始考虑编写更少的代码,例如使用computeIfAbsent()map.getOrDefault()甚至更好!

守着一只汪

containsKey将是正确的方法 io&nbsp;containsValue。available给出可以从缓冲输入中读取多少字节,而不会阻塞等待物理读取。这意味着当低级 I/O 缓冲区为空时,仍然可能有数据。解决方案是让代码“阻塞”,等待下一次物理读取。结果:所有具有最大计数的字节都需要遍历 >= 或 == max。因此:Map<Byte, Integer> map = new HashMap<>();int maxCount = 0;//byte maxByte = 0;int data;while ((data = inputStream.read()) >= 0) {&nbsp; &nbsp; byte b = (byte)data;&nbsp; &nbsp; int count = map.getOrDefault(b, 0) + 1;&nbsp; &nbsp; map.put(b, count);&nbsp; &nbsp; if (count > maxCount) {&nbsp; &nbsp; &nbsp; &nbsp; maxCount = count;&nbsp; &nbsp; &nbsp; &nbsp; //maxByte = b;&nbsp; &nbsp; }}for (Map.Entry<Integer, Integer> entry : map.entrySet()){&nbsp; &nbsp; if (entry.getValue() == maxCount) {&nbsp; &nbsp; &nbsp; &nbsp; System.out.print(entry.getKey() + "\t");&nbsp; &nbsp; }}System.out.println();

蝴蝶刀刀

这条线...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功能
随时随地看视频慕课网APP

相关分类

Java
我要回答