Поэтому я просто написал программу, которая читает конкретный файл и возвращает частоту каждого используемого символа. Это было сделано с использованием односвязного списка (а не java LinkedList, но очень похоже). Я хочу знать, почему это:
while(txtFile.read() != -1){
Character letter = (char) txtFile.read();
freqBag.add(Character.toLowerCase(letter));
}
не работает (он не возвращает правильную частоту данного символа), и почему это:
int c;
while((c = txtFile.read()) != -1){
Character letter = (char) c;
freqBag.add(Character.toLowerCase(letter));
}
работает. Я написал первый, и друг помог мне исправить это.
Это не работает, потому что вы отбрасываете символы. Каждая функция read() возвращает следующий байт (как подписанный int), поэтому ваш код отбрасывает каждый символ (0, 2, 4...).
while(txtFile.read() != -1){ // Read and discard a character
Character letter = (char) txtFile.read(); // Read a character into letter
reqBag.add(Character.toLowerCase(letter)); // Store this letter
}
Код друга не должен работать:
int c; // variable outside the loop
while((c = txtFile.read()) != -1){ // Read a character into c, compare to -1
Character letter = (char) txtFile.read(); // Read another character
freqBag.add(Character.toLowerCase(letter)); // Store this letter
}
Правильный метод должен был бы прочитать только один раз:
int c;
while((c = txtFile.read()) != -1) {
freqBag.add(Character.toLowerCase((char)c));
}
Я подозреваю, что у вас есть опечатка, или вы использовали другой файл и не понимали, что письма все еще отбрасываются.
Прежде всего, вам нужно иметь в виду, что когда вы вызываете метод чтения, вы уже читаете один байт из файла, поэтому, если вы делаете это внутри своего оператора while, вы теряете один байт.
Во-вторых, для меня (с учетом приоритета операторов) эти две части кода делают то же самое, поэтому проблема может быть в другой части кода.