3 回答
TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
那一行:
if?(map.containsValue(data))?...
那不是你想要的。您從文件中讀取一個(gè)字節(jié),并且想知道該字節(jié)是否已存儲(chǔ)。作為關(guān)鍵,而不是價(jià)值!
因此你需要相應(yīng)的邏輯,像這樣:
int?counterForData?=?0;
if?(map.contains(data))?{
??counterForData?=?map.get(data);
}?
map.put(data,?counterForData+1);意思是:你的鍵是“數(shù)據(jù)字節(jié)”,你的值是相應(yīng)的頻率。
當(dāng)該代碼有效時(shí),您可以開始考慮編寫更少的代碼,例如使用computeIfAbsent()map.getOrDefault()甚至更好!
TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
containsKey將是正確的方法 iocontainsValue。available給出可以從緩沖輸入中讀取多少字節(jié),而不會(huì)阻塞等待物理讀取。這意味著當(dāng)?shù)图?jí) I/O 緩沖區(qū)為空時(shí),仍然可能有數(shù)據(jù)。解決方案是讓代碼“阻塞”,等待下一次物理讀取。結(jié)果:所有具有最大計(jì)數(shù)的字節(jié)都需要遍歷 >= 或 == 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貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
這條線...
if?(map.containsValue(data))?map.replace(data,?map.get(data)?+?1); else?map.put(data,?1);
檢查地圖是否已經(jīng)包含值(它不會(huì)因?yàn)槟愕牡貓D是空的)。您想要增加數(shù)據(jù)的數(shù)量(如果存在)或添加數(shù)據(jù)(如果尚不存在)。為此,請(qǐng)將上面的代碼片段替換為...
map.compute(data,?(k,?v)?->?(v?==?null)???1?:?v?+?1);
這會(huì)將新數(shù)據(jù)添加為[data, 1]并將現(xiàn)有數(shù)據(jù)更新為[data, previous value + 1].?如果你使用這個(gè),你應(yīng)該閱讀有關(guān)compute功能
添加回答
舉報(bào)
