Поскольку ваш код не компилируется, трудно сказать, что не так.Вот альтернативное решение для вашей проблемы:
public static void main(String[] args) {
try {
Map<String, Long> csvOccurences = Files.readAllLines(Paths.get("text.csv"))
.stream()
.map(csvLine -> csvLine.split(",")[0])
.collect(Collectors.groupingBy(csvLine -> csvLine, Collectors.counting()));
System.out.println("c occurence -> " + csvOccurences.getOrDefault("c", 0L));
System.out.println("t occurence -> " + csvOccurences.getOrDefault("t", 0L));
System.out.println("z occurence -> " + csvOccurences.getOrDefault("z", 0L));
} catch (Exception exception) {
System.err.print("Unable to elaborate the csv");
exception.printStackTrace();
}
}
Вывод кода:
c occurence -> 2
t occurence -> 3
z occurence -> 0
Я буду рад помочь вам, но сделаю ваш код компилируемым, чтобы мы могли помочь вам отладитьit.
EDIT : более отказоустойчивая версия кода
Map<String, Long> csvOccurences =
Files.readAllLines(Paths.get("text.csv")) // Read the files and get all the lines
.stream() // Iterate all the lines
.map(csvLine -> csvLine.split(",")) // Split the line into tokens (split by ',')
.filter(csvTokens -> csvTokens.length >= 1) // Filter out all the lines that don't have at least 2 tokens
.map(csvTokens -> csvTokens[0]) // Map the stream to only the first token
.map(String::trim) // Trim the string (remove the space at start and at the end)
.filter(csvToken -> csvToken.length() == 1) // Filter out all the token that have more than one letter (is this necessary?)
.collect(Collectors.groupingBy(csvLine -> csvLine, Collectors.counting())); // Count the occurence of each letter and map them Map<Letter, Occurence>
Edit 2, ваш метод исправлен и изменен:
public static int getCount(String fileName, String letter) throws Exception {
// Put the stream inside the try/catch so they get closed automatically
try (FileReader fileReader = new FileReader(fileName);
BufferedReader bufferReader = new BufferedReader(fileReader)) {
// Initialized the counter to 0
int letterCount = 0;
// Declare a line buffer
String lineBuffer;
// While readLine is not returning null put the line inside lineBuffer
while ((lineBuffer = bufferReader.readLine()) != null) {
// Split the line buffer into tokens
String[] lineTokens = lineBuffer.split(",");
// If the tokens are more than 0 and the first token is equal to the letter
if (lineTokens.length > 0 && lineTokens[0].equals(letter)) {
// Increment the letter count
letterCount++;
}
}
// Return the letter count
return letterCount;
}
}
Предпринятые действия:
- Переименованы переменные
- Перемещен поток (BufferedReader / FileReader) внутри try-catch
- Удалено
Scanner sc = new Scanner (System.in);
это было бесполезно - Добавлена проверка длины массива
lineTokens.length > 0
- Убрано для цикла это было бесполезно