Principalele operațiuni cu șiruri de caractere
Îmbinarea șirurilor
Pentru îmbinarea șirurilor, se poate utiliza operația de adunare ("+"):
String str1 = "Java";
String str2 = "Hello";
String str3 = str1 + " " + str2;
System.out.println(str3); // Hello Java
Dacă în operația de adunare a șirurilor este folosit un obiect non-șir, de exemplu, un număr, acel obiect este transformat într-un șir:
String str3 = "Anul " + 2015;
De fapt, la adunarea șirurilor cu obiecte non-șiruri, se apelează metoda valueOf() din clasa String. Această metodă are multe suprascrieri și convertește aproape toate tipurile de date în șir. Pentru a converti obiectele diferitelor clase, metoda valueOf() apelează metoda toString() a acestor clase.
O altă modalitate de a îmbina șiruri este metoda concat():
String str1 = "Java";
String str2 = "Hello";
str2 = str2.concat(str1); // HelloJava
Metoda concat() primește șirul cu care trebuie să îmbine șirul apelant și returnează șirul îmbinat.
O altă metodă de îmbinare este metoda join(), care permite îmbinarea șirurilor cu un separator. De exemplu, cele două șiruri de mai sus au fost unite într-un singur cuvânt „HelloJava”, dar ideal ar fi să fie separate printr-un spațiu. Pentru aceasta, folosim metoda join():
String str1 = "Java";
String str2 = "Hello";
String str3 = String.join(" ", str2, str1); // Hello Java
Metoda join() este statică. Primul parametru este separatorul cu care vor fi separate subșirurile, iar toți ceilalți parametri sunt subșirurile care vor fi unite – în acest caz, două șiruri, deși pot fi și mai multe.
Extracția de caractere și subșiruri
Pentru a extrage caracterele după index, în clasa String este definită metoda char charAt(int index). Aceasta primește un index pentru a obține caracterul și returnează caracterul extras:
String str = "Java";
char c = str.charAt(2);
System.out.println(c); // v
Ca și în tablouri, indexarea începe de la zero.
Dacă trebuie să extragem un grup de caractere sau un subșir, putem folosi metoda getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin). Aceasta primește următorii parametri:
- srcBegin: indexul din șir de la care începe extragerea caracterelor
- srcEnd: indexul din șir până la care se face extragerea
- dst: tabloul de caractere în care vor fi extrase caracterele
- dstBegin: indexul în tabloul dst de la care vor fi adăugate caracterele extrase
String str = "Hello world!";
int start = 6;
int end = 11;
char[] dst = new char[end - start];
str.getChars(start, end, dst, 0);
System.out.println(dst); // world
Compararea șirurilor
Pentru a compara șirurile, sunt utilizate metodele equals() (care ține cont de majuscule/minuscule) și equalsIgnoreCase() (care nu ține cont de majuscule/minuscule). Ambele metode primesc ca parametru șirul cu care trebuie să compare:
String str1 = "Hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
Spre deosebire de compararea numerelor și altor tipuri de date primitive, pentru șiruri nu se folosește semnul egalității ==. În schimb, se folosește metoda equals().
O altă metodă specială, regionMatches(), compară subșiruri în cadrul a două șiruri. Aceasta are următoarele forme:
boolean regionMatches(int toffset, String other, int oofset, int len);
boolean regionMatches(boolean ignoreCase, int toffset, String other, int oofset, int len);
Metoda primește următorii parametri:
- ignoreCase: dacă trebuie ignorată sensibilitatea la majuscule/minuscule în comparație. Dacă valoarea este true, majusculele/minusculele sunt ignorate
- toffset: indexul de început din șirul apelant de la care începe comparația
- other: șirul cu care se compară
- oofset: indexul de început din șirul comparat de la care începe comparația
- len: numărul de caractere comparate în ambele șiruri
Exemplu de utilizare:
String str1 = "Hello world";
String str2 = "I work";
boolean result = str1.regionMatches(6, str2, 2, 3);
System.out.println(result); // true
În acest caz, metoda compară 3 caractere de la indexul 6 al primului șir („wor”) cu 3 caractere de la indexul 2 al celui de-al doilea șir („wor”). Deoarece aceste subșiruri sunt identice, rezultatul este true.
O altă pereche de metode, compareTo(String str) și compareToIgnoreCase(String str), permite de asemenea compararea a două șiruri, dar în plus ne indică dacă un șir este mai mare sau mai mic decât altul.
Dacă valoarea returnată este mai mare decât 0, primul șir este mai mare decât al doilea, dacă este mai mică decât zero, atunci invers. Dacă șirurile sunt egale, se returnează 0.
Ordinea folosită pentru comparare este cea lexicografică. De exemplu, șirul „A” este mai mic decât șirul „B”, deoarece caracterul 'A' vine înaintea caracterului 'B' în alfabet. Dacă primele caractere sunt egale, se iau în considerare următoarele caractere. De exemplu:
String str1 = "hello";
String str2 = "world";
String str3 = "hell";
System.out.println(str1.compareTo(str2)); // -15 - str1 este mai mic decât str2
System.out.println(str1.compareTo(str3)); // 1 - str1 este mai mare decât str3
Căutarea într-un șir
Metoda indexOf() găsește indexul primei apariții a unui subșir în șir, iar metoda lastIndexOf() – indexul ultimei apariții. Dacă subșirul nu este găsit, ambele metode returnează -1:
String str = "Hello world";
int index1 = str.indexOf('l'); // 2
int index2 = str.indexOf("wo"); // 6
int index3 = str.lastIndexOf('l'); // 9
Metoda startsWith() determină dacă șirul începe cu un anumit subșir, iar metoda endsWith() determină dacă șirul se termină cu un anumit subșir:
String str = "myfile.exe";
boolean start = str.startsWith("my"); // true
boolean end = str.endsWith("exe"); // true
Înlocuirea în șir
Metoda replace() permite înlocuirea unei secvențe de caractere dintr-un șir cu alta:
String str = "Hello world";
String replStr1 = str.replace('l', 'd'); // Heddo wordd
String replStr2 = str.replace("Hello", "Bye"); // Bye world
Decuparea unui șir
Metoda trim() elimină spațiile de la începutul și sfârșitul șirului:
String str = " hello world ";
str = str.trim(); // hello world
Metoda substring() returnează un subșir, începând de la un anumit index până la sfârșit sau până la un anumit index:
String str = "Hello world";
String substr1 = str.substring(6); // world
String substr2 = str.substring(3,5); // lo
Modificarea cazului
Metoda toLowerCase() convertește toate caracterele șirului în litere mici, iar metoda toUpperCase() – în litere mari:
String str = "Hello World";
System.out.println(str.toLowerCase()); // hello world
System.out.println(str.toUpperCase()); // HELLO WORLD
Metoda split()
Metoda split() permite împărțirea unui șir în subșiruri, după un anumit separator. Separatorul – un caracter sau un set de caractere – este transmis ca parametru metodei. De exemplu, vom împărți un text în cuvinte separate:
String text = "FIFA will never regret it";
String[] words = text.split(" ");
for(String word : words){
System.out.println(word);
}
În acest caz, șirul va fi împărțit după spațiu. Ieșirea în consolă:
FIFA
will
never
regret
it