Broji pojave čara u nizu

1. Pregled

Postoji mnogo načina za brojanje broja pojavljivanja znaka u a Niz na Javi.

U ovom ćemo se kratkom članku usredotočiti na nekoliko primjera kako brojati znakove, prvo s osnovnom Java knjižnicom, a zatim s drugim knjižnicama i okvirima kao što su Spring i Guava.

2. Korištenje Core Java Lib-a

2.1. Imperativni pristup

Neki programeri možda više vole koristiti jezgru Java. Postoji mnogo načina za brojanje broja pojavljivanja znaka u nizu.

Počnimo s jednostavnim / naivnim pristupom:

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

Nije iznenađujuće da će ovo uspjeti, ali - također nije iznenađujuće - postoje bolji načini za to.

2.2. Korištenje rekurzije

Manje očito, ali ipak zanimljivo rješenje je uporaba rekurzije:

privatni statički int countOccurences (String someString, char searChar, int index) {if (index> = someString.length ()) {return 0; } int count = someString.charAt (index) == pretraživanChar? 1: 0; return count + countOccurences (someString, pretražiliChar, indeks + 1); }

Ovu rekurzivnu metodu možemo pozvati na sljedeći način: useRecursionToCountChars ("slon", "e", 0)

2.4. Korištenje regularnih izraza

Drugi način bio bi korištenje regularnih izraza:

Uzorak uzorka = Pattern.compile ("[^ e] * e"); Podudaranje podudaranja = pattern.matcher ("slon"); broj brojeva = 0; while (matcher.find ()) {count ++; } assertEquals (2, count);

Samo imajte na umu da je ovo rješenje tehnički ispravno, ali neoptimalno, jer je pretjerano koristiti vrlo moćne regularne izraze za rješavanje tako jednostavnog problema kao što je pronalaženje broja pojavljivanja znakova u nizu.

2.5. Korištenje značajki Java 8

Ovdje mogu biti od velike pomoći nove značajke dostupne u Javi 8.

Upotrijebimo streamove i lambde za provedbu brojanja:

Niz someString = "slon"; dugo brojanje = someString.chars (). filter (ch -> ch == 'e'). count (); assertEquals (2, count); long count2 = someString.codePoints (). filter (ch -> ch == 'e'). count (); assertEquals (2, count2);

Dakle, ovo je očito čišće i čitljivije rješenje pomoću osnovne knjižnice.

3. Korištenje vanjskih knjižnica

Pogledajmo sada nekoliko rješenja koja koriste uslužne programe iz vanjskih knjižnica.

3.1. Koristeći StringUtils

Općenito, uvijek je bolje koristiti postojeće rješenje umjesto da izmišljamo svoje. The commons.lang.StringUtils razred nam pruža countMatches () metoda koja se može koristiti za brojanje znakova ili čak podniza u zadanoj Niz.

Prvo, moramo uključiti odgovarajuću ovisnost:

 org.apache.commons commons-lang3 3.5 

Najnoviju verziju možemo pronaći na Maven Central.

Krenimo sada countMatches () za brojanje broja znakova 'e' u doslovnom nizu "slon":

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

3.2. Korištenjem Guave

Guava također može biti od pomoći pri brojanju znakova. Moramo definirati ovisnost:

 com.google.guava guava 21.0 

Najnoviju verziju možemo pronaći na Maven Central.

Pogledajmo kako nam Guava može brzo pomoći da prebrojimo znakove:

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

3.3. Korištenje proljeća

Prirodno dodavanje Proljetnog okvira u vaš projekt samo za brojanje znakova nema smisla. Međutim, ako ga već imamo u našem projektu, samo trebamo koristiti countOccurencesOf () metoda:

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

4. Zaključak

U ovom smo se brzom vodiču usredotočili na razne načine brojanja znakova u nizu. Neki od njih dizajnirani su isključivo na Javi; za neke su bile potrebne dodatne knjižnice.

Naša je preporuka koristiti već postojeće uslužne programe tvrtke StringUtils, Guava ili proljeće. Međutim, ako netko više voli koristiti samo običnu Javu, ovaj članak nudi neke mogućnosti da se upravo tako dobro postigne Java 8.

Kompletni izvorni kod za ove primjere dostupan je u ovom GitHub projektu.


$config[zx-auto] not found$config[zx-overlay] not found