liczenieLiterekWpliku

0

Mam problem, z zadaniem w którym mam policzyć ilość wystąpień małych liter w pliku. Mój program zlicza ilość wystąpień tylko pierwszej litery w pliku, np. w utworzonym pliku o treści
aaa
babccc

program liczy tylko ilość wystąpień literki a, nie zlicza literki b i c. Proszę o podpowiedz.

 public void odczytajPlik(String PlikWe) throws FileNotFoundException {
        File file = new File(PlikWe);
        Scanner odczyt = new Scanner(file);
        int a = 97;
        while (odczyt.hasNextLine()) {
            zdanie = odczyt.nextLine();
            char wyrazy[] = zdanie.toCharArray();
            for (int i = 0; i < wyrazy.length; i++) {
                kodAscii = (int) wyrazy[i];

                if (kodAscii == a) {
                    powtorznie++;
                }
            }
        }
        System.out.println(powtorznie);
        powtorznie = 0;
        a++;
    }
}
0

Weź edytuj ten post by dało się go czytać.

1
if (kodAscii == a) {
                    powtorznie++;
                }

Skoro zliczasz tylko jeśli wystąpiło a to logiczne że program zlicza tylko literki a. W czym problem? Jeśli ma zliczać inne to musisz napisać program który zlicza inne.

0

Po co zamieniasz char na int (asci)? Przecież możesz zrobić:

if (wyrazy[i] == 'a')
0

ja to bym tak rozwiązał, niech ktoś poprawi jeśli można to zrobić w ładniejszy sposób

	public static void solution(File file){
		FileReader fileReader;
		Map<Character, Integer> map;
		try{
			fileReader = new FileReader(file);
			map = new TreeMap<>();
			int c;
			
			while((c = fileReader.read()) != -1	)
				if(c >= 'a' && c <= 'z'){
					char z = (char) c;
					map.put(z, map.get(z) == null ? 1 : map.get(z)+1);
				}
			
			System.out.println(map);
			fileReader.close();		
		}catch(IOException e){
			System.out.println(file.getName() + " cannot be found");
		}
	}
0

Można w kilku linijkach:

public static void main(String[] args) throws IOException {
		System.out.println(Paths.get("gradle.build").toUri()); // przykładowy plik
		Predicate<String> smallLetter = l -> l.charAt(0) >= 'a' && l.charAt(0) <= 'z'; // małe litery
		Predicate<String> isEmpty = l -> l.isEmpty();  // pusty
		Predicate<String> isNotEmpty = isEmpty.negate(); // niepusty
		Map<String, Long> collect = Files.readAllLines(Paths.get("build.gradle"))  // wczytuje wszystkie linie
				.stream() /// jako strumień
				.map(((Function<String, String[]>) s -> s.split("")).andThen(Arrays::stream)) // dzieli każdą linię na znaki i następnie zamienia powstałą tablicę w strumień
				.flatMap(Function.identity())  // spłaszcza strumień strumieni w strumień
				.filter(isNotEmpty.and(smallLetter)) // odrzucamy to co nas nie interesuje
				.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));  // grupuje po znaku, po czym zlicza wielość wyniku

		System.out.println(collect);  // wypisuje
	}

// edit
dodana filtrowanie tylko małych liter

0

Ja bym juz prędzej zrobił:

        Map<Character, Long> counter = new String(Files.readAllBytes(Paths.get("file.txt")))
                .chars()
                .mapToObj(letter -> ((char) letter))
                .collect(Collectors.groupingBy(
                        letter -> letter,
                        Collectors.counting()));
        System.out.println(counter);
0

Bardzo dobrze opisałeś swój problem. Napisałeś i pokazałeś, co już potrafisz i czego Ci brakuje. Można było ewentualnie lepiej opisać, co ma być na wyjściu: ilość wystąpień litery a, ilość wystąpień litery b, itd.

Poczytaj sobie o tablicach i spróbuj tu zastosować tablicę typu int z literkami. To podejście ogólne. W Javie prościej się posłużyć mapą, tak jak w podanym rozwiązaniu. Powinieneś umieć i tak, i tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1