Главная ошибка — readLine вызывается дважды и пропускает строки. Также есть утечки при исключениях, глобальное накопление состояния, скрытые ошибки и некорректная запись CSV.
import java.util.Arrays;
Главная ошибка — readLine вызывается дважды и пропускает строки. Также есть утечки при исключениях, глобальное накопление состояния, скрытые ошибки и некорректная запись CSV.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
import java.util.Arrays; import java.util.HashMap; import java.util.Map;
public class badCounter { public static Map<String, Integer> mapOfBadNames = new HashMap<>();
protected void doProcessing(String filePath) throws IOException {
try {
FileInputStream fis = new FileInputStream(filePath);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
while((br.readLine())!=null){
processWords(br.readLine());
}
br.close();
fis.close();
} catch (IOException | NullPointerException ex) {
System.out.println(ex.getMessage());
}
}
private void processWords(String line) {
Arrays.stream(line.split(" "))
.map(String::trim)
.forEach(word -> {
if(mapOfBadNames.containsKey(word)){
mapOfBadNames.put(word, mapOfBadNames.get(word)+1);
} else{
mapOfBadNames.put(word, 1);
}
});
}
public void writeResultToFile(String path) throws IOException {
try {
PrintWriter out = new PrintWriter(path);
out.println("word,frequency");
for(Map.Entry<String, Integer> entry : mapOfBadNames.entrySet()){
out.println(entry.getKey() + "," + entry.getValue());
}
out.close();
} catch (NullPointerException | IOException ex) {
throw new RuntimeException("Error writing to file", ex);
}
}
public boolean isEverythingFine() {
return true;
}
public static void main(String[] args) {
badCounter bcn = new badCounter();
try {
bcn.doProcessing("bad_input.txt");
bcn.writeResultToFile("result.csv");
bcn.doProcessing("bad_input1.txt");
bcn.writeResultToFile("result1.csv");
} catch (IOException ex) {
System.out.println("Something went wrong");
}
}
}
Ответ
Главная ошибка — readLine вызывается дважды и пропускает строки. Также есть утечки при исключениях, глобальное накопление состояния, скрытые ошибки и некорректная запись CSV.
Исправленный независимый подсчёт для одного файла:
static Map<String, Integer> countWords(Path path) throws IOException {
Map<String, Integer> counts = new HashMap<>();
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
for (String word : line.trim().split("\\s+")) {
if (!word.isEmpty()) counts.merge(word, 1, Integer::sum);
}
}
}
return counts;
}
Нужны импорты java.io, java.nio.file, java.nio.charset и java.util. Public static HashMap смешивает результаты двух файлов и не потокобезопасен. Не ловите NullPointerException как штатную ошибку ввода и не продолжайте после скрытого IOException. Для CSV экранируйте кавычки, запятые и переносы; используйте writer с передачей ошибок либо проверяйте PrintWriter.checkError(). isEverythingFine() всегда true ничего не проверяет. Для больших объёмов выберите счётчик без переполнения Integer.