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.