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條經驗 獲得超4個贊
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
功能
添加回答
舉報