Provjerite sadrži li niz podniz

1. Pregled

U ovom uputstvu pregledat ćemo nekoliko načina provjere je li Niz sadrži podniz, a mi ćemo usporediti izvedbu svakog od njih.

2. String.indexOf

Pokušajmo prvo koristiti String.indexOf metoda. indexOf daje nam prvu poziciju na kojoj se nalazi podniz ili -1 ako uopće nije pronađen.

Kada tražimo "Rhap", vratit će se 9:

Assert.assertEquals (9, "Bohemian Rhapsodyan" .indexOf ("Rhap"));

Kada tražimo "rhap", vratit će -1 jer razlikuje velika i mala slova.

Assert.assertEquals (-1, "Bohemian Rhapsodyan" .indexOf ("rhap")); Assert.assertEquals (9, "Bohemian Rhapsodyan" .toLowerCase (). IndexOf ("rhap"));

Također je važno napomenuti da ako pretražujemo podniz "An", vratit će 6 jer vraća prvu pojavu:

Assert.assertEquals (6, "Bohemian Rhapsodyan" .indexOf ("an"));

3. Niz.sadrži

Dalje, pokušajmo Niz.sadrži. sadrži pretražit će podniz kroz cijelu Niz i vratit će se pravi ako se pronađe i lažno inače.

U ovom primjeru, sadrži vraća se pravi jer je "Hej" pronađeno.

Assert.assertTrue ("Hej Ho, idemo" .contains ("Hey"));

Ako niz nije pronađen, sadrži vraća se lažno:

Assert.assertFalse ("Hej Ho, idemo" .contains ("jey"));

U posljednjem primjeru "hej" nije pronađen jer Niz.sadrži razlikuje velika i mala slova.

Assert.assertFalse ("Hej Ho, idemo" .contens ("hey")); Assert.assertTrue ("Hej Ho, idemo" .toLowerCase (). Sadrži ("hej"));

Zanimljiva je stvar sadrži interno poziva indexOfda znam je li podniz je sadržan ili nije.

4. StringUtils.containsIgnoreCase

Naš treći pristup će biti korištenje StringUtils #containsIgnoreCase iz biblioteke Apache Commons Lang:

Assert.assertTrue (StringUtils.containsIgnoreCase ("odbjegli vlak", "vlak")); Assert.assertTrue (StringUtils.containsIgnoreCase ("Odbjegli vlak", "Vlak"));

To možemo vidjeti provjerit će je li podniz sadržan je u a Niz, zanemarujući slučaj. Zato containsIgnoreCase vraća se pravi kada tražimo "Trai", a također i "trai" unutar "Odbjeglog vlaka".

Ovaj pristup neće biti učinkovit kao prethodni pristupi jer je potrebno dodatno vrijeme za ignoriranje slučaja. containsIgnoreCase interno pretvara svako slovo u veliko slovo i uspoređuje pretvorena slova umjesto izvornih.

5. Korištenje Uzorak

Naš posljednji pristup bit će korištenje a Uzorak s regularnim izrazom:

Uzorak uzorka = Pattern.compile ("(??

To možemo uočiti moramo izgraditi Uzorak prvo, onda moramo stvoriti Podudaranje, i na kraju, možemo provjeriti kod pronaći metoda ako postoji pojava podniza ili ne:

Podudaranje podudaranja = pattern.matcher ("Udri na put Jack"); Assert.assertTrue (matcher.find ());

Na primjer, prvi put to pronaći izvrši, vrati se pravi jer je riječ "cesta" sadržana unutar niza "Hit the road Jack", ali kad pokušamo pronaći istu riječ u nizu "i više se ne vraćate", ona se vraća lažno:

Podudaranje podudaranje = pattern.matcher ("i nemoj se više vraćati"); Assert.assertFalse (matcher.find ());

6. Usporedba izvedbe

Upotrijebit ćemo mikro-referentni okvir otvorenog koda tzv Kabelski svežanj Java Microbenchmark (JMH) kako bi se odlučilo koja je metoda najučinkovitija u pogledu vremena izvršenja.

6.1. Postavljanje mjerila

Kao i u svakoj JMH referentnoj vrijednosti, i mi imamo mogućnost pisanja a postaviti metodu, kako bi se postavile određene stvari prije pokretanja naših mjerila:

@Setup setup javne praznine () {message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit," + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris "+" Niste nužni aliquip ex ea commodo posledica. Duis aute irure dolor in "+" reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. "+" Excepteur sint occaecat cupidatat non proident, sunt in culpa quifficia deserunt "+" mollit anim id est laborum "; pattern = Pattern.compile ("(?

U postaviti metodom, inicijaliziramo poruka polje. Koristit ćemo ga kao izvorni tekst za razne implementacije pretraživanja.

Također inicijaliziramo uzorak kako bismo ga kasnije koristili u jednom od naših mjerila.

6.2. The String.indexOf Mjerilo

Koristit će se naša prva mjerila indexOf:

@Benchmark public int indexOf () {return message.indexOf ("eiusmod"); }

Pretražit ćemo u kojem je položaju "eiusmod" prisutan u poruka varijabilna.

6.3. The Niz.sadrži Mjerilo

Koristit će se naša druga mjerila sadrži:

@Benchmark javni boolean sadrži () {return message.contains ("eiusmod"); }

Pokušat ćemo pronaći je li poruka vrijednost sadrži “Eiusmod”, isto podniz korišteno u prethodnoj referentnoj vrijednosti

6.4. The StringUtils.containsIgnoreCase Mjerilo

Treće će se mjerilo koristiti StringUtils #containsIgnoreCase:

@Benchmark javni boolean sadržiStringUtilsIgnoreCase () {return StringUtils.containsIgnoreCase (poruka, "eiusmod"); }

Kao i kod prethodnih mjerila, pretraživat ćemo i podniz u poruka vrijednost.

6.5. The Uzorak Mjerilo

I koristit će se naša posljednja mjerila Uzorak:

@Benchmark javno logičko pretraživanjeWWPattern () {return pattern.matcher (poruka) .find (); }

Upotrijebit ćemo obrazac inicijaliziran u postaviti metoda za stvaranje a Podudaranje i moći nazvati pronaći metoda, koristeći isti podniz kao i prije.

6.6. Analiza rezultata mjerila

Važno je to napomenuti ocjenjujemo rezultate mjerenja u nanosekundama.

Nakon pokretanja našeg JMH testa možemo vidjeti prosječno vrijeme koje je trebalo svako:

  • sadrži: 14,736 ns
  • indexOf: 14.200 ns
  • containsStringUtilsIgnoreCase: 385.632 ns
  • searchWithPattern: 1014,633 ns

indexOf metoda je najučinkovitija, a usko slijedi sadrži. To ima smisla sadrži je trebalo dulje jer se koristi indexOf iznutra.

containsStringUtilsIgnoreCase uzeo je dodatno vrijeme u usporedbi s prethodnima jer ne razlikuje velika i mala slova.

searchWithPattern, uzeo još veće prosječno vrijeme posljednjeg, dokazujući da pomoću Uzoraks je najgora alternativa za ovaj zadatak.

7. Zaključak

U ovom smo članku istražili razne načine pretraživanja podniza u Niz. Također smo usporedili performanse različitih rješenja.

Kao i uvijek, kôd je dostupan na GitHub-u.


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