亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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條經驗 獲得超4個贊

  • 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 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號