Zliczanie wystąpień znaku w ciągu

1. Przegląd

Istnieje wiele sposobów zliczania liczby wystąpień znaku w ciągu znaków w języku Java.

W tym krótkim artykule skupimy się na kilku przykładach liczenia znaków, najpierw za pomocą podstawowej biblioteki Java, a następnie za pomocą innych bibliotek i struktur, takich jak Spring i Guava.

2. Korzystanie z Core Java Lib

2 .1. Podejście imperatywne

Niektórzy programiści mogą preferować używanie podstawowej Javy. Istnieje wiele sposobów zliczania liczby wystąpień znaku w ciągu znaków.

Zacznijmy od prostego / naiwnego podejścia:

String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) { if (someString.charAt(i) == someChar) { count++; } } assertEquals(2, count);

Nic dziwnego, że to zadziała, ale - co nie jest zaskakujące - istnieją lepsze sposoby, aby to zrobić.

2.2. Korzystanie z rekursji

Mniej oczywistym, ale wciąż interesującym rozwiązaniem jest użycie rekurencji:

private static int countOccurences( String someString, char searchedChar, int index) { if (index >= someString.length()) { return 0; } int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); }

Możemy wywołać tę metodę rekurencyjną w następujący sposób: useRecursionToCountChars („elephant”, 'e', ​​0)

2.4. Używanie wyrażeń regularnych

Innym sposobem byłoby użycie wyrażeń regularnych:

Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);

Zwróć uwagę, że to rozwiązanie jest technicznie poprawne, ale nieoptymalne, ponieważ używanie bardzo potężnych wyrażeń regularnych do rozwiązania tak prostego problemu, jak znalezienie liczby wystąpień znaku w ciągu, jest przesadą.

2.5. Korzystanie z funkcji Java 8

Nowe funkcje dostępne w Javie 8 mogą być tutaj bardzo pomocne.

Użyjmy strumieni i lambd, aby zaimplementować liczbę:

String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);

Jest to więc wyraźnie czystsze i bardziej czytelne rozwiązanie wykorzystujące bibliotekę podstawową.

3. Korzystanie z bibliotek zewnętrznych

Przyjrzyjmy się teraz kilku rozwiązaniom, które wykorzystują narzędzia z zewnętrznych bibliotek.

3.1. Korzystanie z StringUtils

Generalnie zawsze lepiej jest skorzystać z istniejącego rozwiązania niż wymyślać własne. Commons.lang.StringUtils klasa dostarcza nam countMatches () metoda, która może być stosowany do liczenia znaków lub nawet sub-ciągi znaków w danym ciągu znaków .

Najpierw musimy uwzględnić odpowiednią zależność:

 org.apache.commons commons-lang3 3.5 

Najnowszą wersję możemy znaleźć na Maven Central.

Użyjmy teraz countMatches (), aby policzyć liczbę znaków „e” w literale String „elephant”:

int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);

3.2. Korzystanie z guawy

Guawa może być również pomocna w liczeniu znaków. Musimy zdefiniować zależność:

 com.google.guava guava 21.0 

Najnowszą wersję możemy znaleźć na Maven Central.

Zobaczmy, jak guawa może szybko pomóc nam w liczeniu znaków:

int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);

3.3. Korzystanie z Spring

Naturalnie dodawanie Spring Framework do projektu tylko po to, aby policzyć znaki, nie ma sensu. Jeśli jednak mamy to już w naszym projekcie, wystarczy skorzystać z metody countOccureBIZOf () :

int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);

4. Wniosek

W tym krótkim samouczku skupiliśmy się na różnych sposobach liczenia znaków w łańcuchu. Niektóre z nich zostały zaprojektowane wyłącznie w Javie; niektóre wymagały dodatkowych bibliotek.

Naszą rekomendacją jest użycie już istniejących narzędzi firm StringUtils , Guava lub Spring. Jeśli jednak ktoś woli używać tylko zwykłej Javy, ten artykuł oferuje pewne możliwości osiągnięcia tego samego w Javie 8.

Pełny kod źródłowy tych przykładów jest dostępny w tym projekcie GitHub.