U ovom tekstu ćemo vam pružiti pomoć pri razumevanju podstringova u programskom jeziku Java. Osim teorijskog objašnjenja, daćemo vam i konkretne primere koda koji će vam pomoći da sve to vizuelizujete. Naučićemo vas kako da kreirate podstringove i kako da pretražujete podstringove unutar niza karaktera.
Pre nego što pređemo na praktične primere, moramo se upoznati sa osnovnim konceptima podstringova.
Šta su nizovi i podnizovi?
U kontekstu Jave, string predstavlja sekvencu karaktera. Svaki string u Javi je zapravo objekat. String u Javi može sadržati slova, simbole, brojeve, pa čak i praznine. Sa druge strane, podniz u Javi je deo ili podskup datog Java stringa.
Na primer, „Geek“ je podniz od „GeekFlare“. Podnizovi vam omogućavaju da izdvojite specifičan deo stringa.
Ako imate ime „John Doe“ i želite samo ime „John“, lako ga možete dobiti pomoću podstringova. Takođe, ako imate listu imena „John, Jack, Jolly“ i želite da proverite da li je „John“ na toj listi, to možete uraditi uz pomoć podstringova. Ovo su samo neki jednostavni primeri. Podnizove možemo koristiti u različitim operacijama kada ih razumemo.
Sada kada smo upoznati sa konceptom podstringova u Javi, hajde da vidimo kako možemo kreirati podstringove i raditi sa njima u Javi.
#1. Korišćenje metode ‘substring()’
Metoda ‘substring()’ nam omogućava da kreiramo podstringove na vrlo jednostavan način. Ona kao ulaz prima jedan ili dva parametra – startIndeks ili startIndeks i endIndeks, i vraća nam željeni podstring.
U zavisnosti od broja parametara, možemo je koristiti na dva načina. Sada, hajde da detaljno proučimo svaki od njih.
substring (int startIndeks)
Za početak, možemo koristiti metodu u obliku ‘substring(startIndeks)’. Ovde ova metoda prima celobrojnu vrednost kao ulaz, gde je ulaz početna pozicija podniza. Vraća string počevši od datog početnog indeksa pa sve do kraja originalnog stringa.
Kao primer, pogledajmo sledeći kod:
public class Substrings{ public static void main(String args[]){ String str="techblog.co.rs"; System.out.println("Dati string: " + str); System.out.println("Podstring: " +str.substring(4)); //indeksi stringova počinju od 0 } }
IZLAZ:
Dati string: techblog.co.rs Podstring: blog.co.rs
Iz izlaza vidimo da je ulazni niz bio „techblog.co.rs“, a povratna vrednost je podniz „blog.co.rs“. Dakle, podniz je kreiran od datog indeksa (4), odnosno od pozicije 5 do kraja niza.
substring(int startIndeks, int endIndeks)
Ovo je još jedan način da se koristi metoda substring klase String. Metodi substring možemo proslediti dva cela broja. Početni indeks i završni indeks. Da bismo koristili ovu varijantu metode, moramo je primeniti u obliku ‘substring(startIndeks,endIndeks)’.
Da bismo bolje razumeli, pogledajmo primer koda:
public class Substrings{ public static void main(String args[]){ String str="GeekFlareFans"; System.out.println("Dati string: " + str); System.out.println("Podstring: " +str.substring(4,9)); //Dobijate podstring počevši od indeksa broj 4 do indeksa 8. } }
IZLAZ:
Dati string: GeekFlareFans Podstring: Flare
Kao što vidimo, za string „GeekFlareFans“, metoda daje podniz „Flare“. Prosledili smo početni indeks 4 i završni indeks 9. Podniz počinje od elementa sa indeksom 4 i završava se pre indeksa 9. Važno je napomenuti da element sa završnim indeksom nije uključen. Metoda daje podstring koji uključuje sve elemente do završnog indeksa, ali isključuje element sa samim tim indeksom.
#2. Korišćenje metode ‘split()’
‘split()’ je još jedna metoda klase String u Javi koja nam pomaže da kreiramo podstring. Korisna je kada se više informacija čuva unutar jednog stringa sa zajedničkim separatorom.
Sintaksa pominje termin „regex“, koji vam može izgledati malo zastrašujuće, pa hajde da razumemo šta je regex pre nego što nastavimo. Regex je skraćeni termin za „regularne izraze“. Regularan izraz je niz znakova koji opisuje šablon unutar stringa ili teksta. U kontekstu split metode, regularan izraz je naš separator.
Metoda ‘split()’ može da primi do dve promenljive kao ulaz, to su niz regularnih izraza i ograničeni ceo broj. Regularan izraz je separator, koji, kada se pronađe, dovodi do cepanja originalnog stringa na 2 dela – deo pre regularnog izraza i deo posle regularnog izraza.
Na primer, pretpostavimo da pokušavate da podelite string „abcdef“ sa „bcd“ kao regularnim izrazom. Dobili bismo podnizove „a“ i „ef“ kao rezultat.
Metoda vraća niz sa razdvojenim stringovima. Možemo navesti samo regularan izraz, ili i regularan izraz i ograničenje. Hajde da se upoznamo sa više načina pozivanja ove metode jedan po jedan.
split (niz regex)
Prvi metod prima samo niz regularnih izraza u formatu ‘split(regex)’. Nema graničnu promenljivu; stoga vraća sve odvojene podstringove u nizu.
Hajde da ovo bolje razumemo uz pomoć primera koda:
public class Substrings{ public static void main(String args[]){ String str="Geek%Flare"; String[] substrings=str.split("%"); System.out.println("Dati string: " + str); System.out.println("Prvi podstring: " + substrings[0]); System.out.println("Drugi podstring: " + substrings[1]); } }
IZLAZ:
Dati string: Geek%Flare Prvi podstring: Geek Drugi podstring: Flare
Kao što vidimo iz koda, dati string ima regularan izraz za razdvajanje „%“. Ne mora da bude jedan znak, može biti bilo koji niz sa bilo kojim brojem znakova. Metoda ‘split()’ ignoriše ovaj regularan izraz i daje nam sve stringove koje je taj regularan izraz razdvojio. Podnizovi se čuvaju unutar niza.
U kodu, dati string je „Geek%Flare“. Dakle, dobijamo niz sa dva elementa, a to su „Geek“ i „Flare“. Kasnije smo im pristupili sa njihovim indeksima, koji su 0 i 1, i odštampali smo „Geek“ i „Flare“ na konzoli.
Ovde takođe treba da napomenemo da ako se metodi ne proslede nikakvi parametri, ona će jednostavno izbaciti grešku. Ali ako damo prazan string („“) kao regularan izraz, dobićemo svaki pojedinačni znak kao podniz. Pogledajmo primer da to vizuelizujemo.
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare"; String[] substrings=str.split(""); System.out.println(Arrays.toString(substrings)); } }
IZLAZ:
[G, e, e, k, %, F, l, a, r, e]
Iz primera je očigledno da kada je parametar regularnog izraza prazan string, metoda vraća sve karaktere kao zasebne podstringove, a to jasno vidimo kada štampamo izlazni niz metode ‘split()’.
split (niz regularnog izraza, int ograničenje)
Sa drugom varijantom ove metode dobijamo veću kontrolu nad izlazom i možemo dodatno fino podesiti izlaz metode ‘split()’. Ovde metoda ‘split()’ prima dve promenljive kao ulaz. U ovom slučaju, zajedno sa regularnim izrazom, dajemo i parametar ograničenja u navedenom formatu ‘split(regex, limit)’.
‘Limit’ je broj rezultujućih stringova koji će se izbaciti. U zavisnosti od vrednosti limita, postoje tri moguće opcije:
Slučaj 1: Ako je limit > 0, rezultujući niz bi sadržao izlaz, ali bi primenio podelu (limit-1) najviše puta. Ovde rezultujući niz ne bi sadržao više elemenata od navedenog ograničenja, a sav preostali niz koji nije podeljen bio bi sačuvan kao što je bio. Hajde da olakšamo razumevanje uz pomoć koda.
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%the%best"; String[] substrings=str.split("%",2); System.out.println(Arrays.toString(substrings)); } }
IZLAZ:
[Geek, Flare%is%the%best]
Pogledajte u izlazu kako postoje samo dva elementa u rezultujućem nizu, što je broj koji je dat u parametru limita. Takođe, primetite da se podela primenjuje samo jednom, dakle (limit-1) puta.
Međutim, ako je regularan izraz tu dva puta zaredom („%%“), dobili bismo prazne podstringove. Pogledajte ovaj deo koda da biste to bolje razumeli.
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",5); System.out.println(Arrays.toString(substrings)); } }
IZLAZ:
[Geek, Flare, is, , the%best%%%]
U suštini, ako „%“ prati još jedan „%“ ili kraj stringa, on se transformiše u prazan podniz.
Slučaj 2: Ako je ograničenje < 0, akcija razdvajanja bi se primenila onoliko puta koliko je moguće bez ograničenja veličine niza, ali bi niz sadržao prazne podstringove ako je regularan izraz tu dva puta zaredom („%%“).
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",-1); System.out.println(Arrays.toString(substrings)); } }
IZLAZ:
[Geek, Flare, is, , the, best, , , ]
Iz izlaza je očigledno da se podela primenjuje što je više puta moguće, a takođe su prisutni i prazni podnizovi.
Slučaj 3: Ako je limit=0, akcija razdvajanja bi takođe bila primenjena što je više moguće puta, ali bi ovde svi prazni podnizovi na kraju stringa bili odbačeni iz niza.
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",0); System.out.println(Arrays.toString(substrings)); } }
IZLAZ:
[Geek, Flare, is, , the, best]
Možemo videti da je izlaz prilično sličan između kada je limit=-1 i kada je limit=0, ali nema praznih podstringova na kraju. Drugim rečima, prazni podstringovi na kraju niza podstringova se zanemaruju.
Takođe imajte na umu da ako regularan izraz nije prisutan u stringu, on vraća ceo originalni string kao rezultat.
Proveravanje da li string sadrži podniz
Pored kreiranja podstringova od postojećih stringova, takođe možemo da navedemo podniz i proverimo da li taj podniz postoji unutar stringa. Ovo je brz i lak način za testiranje podnizova, i to je korisno u mnogim slučajevima. Ali kako to da uradimo? Različite metode nam mogu pomoći da to postignemo. Hajde da ih prođemo jedan po jedan.
Korišćenje metode ‘contains()’:
Vrlo lako možemo pronaći postojanje podniza pomoću metode ‘contains()’. Ova metoda string klase prima string kao ulaz, koji je naš podniz, i vraća logičku vrednost koja proverava da li je podstring unutar stringa ili ne. Ovaj metod se može koristiti unutar if-else blokova, unarnih operatora i raznih drugih mesta za implementaciju složene logike.
Hajde da se malo bolje upoznamo sa ovom metodom.
public class Substrings{ public static void main(String args[]){ String str="techblog.co.rs"; System.out.println("Da li sadrži Flare? \n"+ str.contains("Flare")); } }
IZLAZ:
Da li sadrži Flare? false
Kod proverava string „techblog.co.rs“ za reč „Flare“, i pošto je ne pronalazi, vraća logičku vrednost „false“, čime potvrđuje nepostojanje podniza.
public class Substrings{ public static void main(String args[]){ String str="techblog.co.rs"; System.out.println("Da li sadrži blog? \n"+ str.contains("blog")); } }
IZLAZ:
Da li sadrži blog? true
Iz primera razumemo da ako se podstring nalazi unutar stringa, metoda će vratiti „true“ da bi označila njegovo postojanje. Tako da možemo lako biti sigurni da li podniz postoji.
Pronalaženje pozicije podniza
#1. Korišćenje ‘indexOf()’:
Metoda ‘indexOf()’ se može koristiti za pronalaženje postojanja podniza, kao i za pronalaženje njegovog indeksa. Metoda prima kao ulaz string ili karakter i daje nam poziciju njegovog prvog pojavljivanja. Ali može da nam da samo indeks prvog pojavljivanja i ne može da potvrdi da li postoje druge pojave. Još jedna stvar koju treba primetiti ovde, ako podstring ne postoji, metoda vraća -1.
Dakle, hajde da istražimo ovaj metod malo više.
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Indeks od Flare: "+ str.indexOf("Flare")); } }
IZLAZ:
Indeks od Flare: 4
Ovde u primeru, prvo pojavljivanje podniza „Flare“ počinje od indeksa 4 u nizu „GeekFlareGeekFlare“. Dakle, kao što se očekivalo, funkcija je vratila taj indeks.
#2. Korišćenje ‘lastIndexOf()’:
‘lastIndexOf()’ je vrlo sličan ‘indexOf()’. Obadve ove metode primaju kao ulaz podstring i vraćaju indeks njegove pozicije. Čak imaju istu povratnu vrednost kada ne mogu da pronađu podniz u navedenom nizu. Obe ove metode vraćaju -1 za neuspešno pronalaženje.
Ali dok ‘indexOf()’ vraća indeks prvog pojavljivanja podniza, ‘lastIndexOf()’ vraća indeks poslednjeg pojavljivanja.
Hajde da to vidimo na delu kroz kod:
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Poslednji indeks od Flare: "+ str.lastIndexOf("Flare")); } }
IZLAZ:
Poslednji indeks od Flare:13
Posmatrajući ovaj izlaz, shvatamo da se metoda ‘lastIndexOf()’ ponaša kako se očekuje i dobijamo indeks poslednjeg pojavljivanja podniza „Flare“ u stringu „GeekFlareGeekFlare“.
FAQ
Kako koristiti metodu ‘split()’ za kreiranje nepraznih podstringova?
Ako postoji više instanci regularnog izraza u glavnom nizu jedna za drugom („Hello%%Hi“, gde je regex „%“), metoda „split()“ smatra prvu instancu znakom za prekid, a za ostatak daje izlaz praznog stringa. Da bismo ovo izbegli, možemo odrediti parametar limit kao 0. Stoga će kao izlaz dati samo neprazne stringove.
Da li ‘indexOf()’ vraća indekse svih instanci podniza?
Ne, ‘indexOf()’ ne vraća indekse svih instanci podniza. Sa ‘indexOf()’ dobijamo celobrojnu povratnu vrednost koja sadrži indeks prvog pojavljivanja podniza. Ali ako ne može da pronađe podniz, metoda će vratiti -1.
Šta vraća metoda ‘substring()’ ako dati indeksi ne postoje u stringu?
Ako dati početni indeks i krajnji indeks ne postoje u stringu, kompajler će izbaciti grešku. Greška bi trebalo da bude „java.lang.StringIndexOutOfBoundsException: “ i jednostavno se neće izvršiti.
Zaključak
U ovom članku smo razgovarali o različitim metodama i osnovama za početak rada sa podstringovima. Razgovarali smo o kreiranju podniza i proveravanju postojanja podniza unutar stringa. Ovo će vam dati bolje razumevanje kako da radite sa podstringovima. Pratite primere i vežbajte više da biste stekli temeljno razumevanje podstringova.
Zatim možete da pogledate našu listu pitanja za Java intervju.