Beszéljünk a Java String.split metódusáról: mit csinál és miért van rá szükség. Nem nehéz kitalálni, hogy feloszt egy Java karakterláncot, de hogyan működik ez a gyakorlatban? Merüljünk el mélyen a módszer működésében, és beszéljünk meg néhány nem nyilvánvaló részletet. Ugyanakkor megtudjuk, hogy valójában hány osztási metódusa van a Stringnek . Gyerünk!
Figyelje meg a fenti táblázat utolsó két sora közötti különbségeket. A másodiktól az utolsó sorban vesszőt használunk határolóként. Ennek eredményeként, amikor a karakterlánc fel van osztva, néhány szóban szóköz van. Az utolsó sorban vesszőt és szóközt használtunk határolóként. Ez az oka annak, hogy a kapott tömbben nem voltak bevezető szóközzel rendelkező részkarakterláncok. Ez csak egy finom részlet, amely megmutatja, mennyire fontos a megfelelő határoló körültekintő kiválasztása.
A Java String.split leírása és aláírása
A Java nyelvben a split metódus egy karakterláncot részkarakterláncokra oszt fel egy reguláris kifejezéssel definiált határoló segítségével. Mutassuk be a metódus aláírását, és kezdjük merülésünket:
String[] split(String regex)
Két dolog derül ki az aláírásból:
- A metódus egy karakterlánc-tömböt ad vissza.
- A metódusnak van egy regex nevű karakterlánc bemeneti paramétere .
-
A metódus egy karakterlánc-tömböt ad vissza.
A deklaráció a következő szavakat tartalmazza: "A Java-ban a split metódus részkarakterláncokra osztja a karakterláncot." A metódus ezeket a részkarakterláncokat egy tömbbe gyűjti, amely a visszatérési értékké válik.
-
A metódusnak van egy regex nevű karakterlánc bemeneti paramétere .
Emlékezzünk vissza a leírásra: "egy karakterláncot részkarakterláncokra oszt fel egy reguláris kifejezéssel meghatározott határoló segítségével." A regex bemeneti paraméter egy reguláris kifejezés, amely az eredeti karakterláncra vonatkozik. Ha a karakter vagy karakterkombináció egyezik, a rendszer határolóként kezeli őket.

A Java megosztott a gyakorlatban
Most menjünk közelebb a lényeghez. Képzeljük el, hogy van egy sor szavunk. Például így:
Imádom a Java-t
Szavakra kell osztanunk a karakterláncot. Látjuk, hogy ebben a karakterláncban a szavakat szóköz választja el egymástól. Ebben az esetben egy szóköz karakter a tökéletes jelölt határolónknak. A feladatunk megoldására szolgáló kód így néz ki:
public class Main {
public static void main(String[] args) {
String str = "I love Java";
String[] words = str.split(" ");
for (String word : words) {
System.out.println(word);
}
}
}
A fő módszer kimenete a következő sorok lesz:
Imádom a Java-t
Lássunk még néhány példát a felosztási módszer működésére:
Húr | Határoló | A módszer eredménye |
"Imádom a Java-t" | " " (szóköz) | { "én" , "szerelem" , "Java" } |
"192.168.0.1:8080" | ":" | { "192.168.0.1" , "8080" } |
"Piros, narancs, sárga" | "," | { "Piros" , "narancssárga" , "sárga" } |
"Piros, narancs, sárga" | ", " | { "Piros" , "narancssárga" , "sárga" } |
Vezető határoló
Ez egy másik fontos árnyalat. Ha az eredeti karakterlánc a határolóval kezdődik, akkor a kapott tömb első eleme egy üres karakterlánc lesz. Például így nézne ki: Eredeti karakterlánc: "I love Java" Határoló: " " Eredmény tömb: { "", "I", "love", "Java" } De ha az eredeti karakterlánc határolóval végződik, akkor inkább mint eggyel kezdődően, akkor az eredmény más lesz: Eredeti karakterlánc: "Imádom a Java-t " Határoló: " " Az eredmény tömbje: { "I", "love", "Java"
public class Main {
public static void main(String[] args) {
print("I love Java".split(" "));
print(" I love Java".split(" "));
print("I love Java ".split(" "));
print(" I love Java ".split(" "));
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
A fő módszer kimenete a következő lesz:
[I, love, Java] [, I, love, Java] [I, love, Java] [, I, love, Java]
Ismét forduljon arra a tényre, hogy ha az eredeti karakterlánc első karaktere egy határoló karakter, akkor a tömb első eleme egy üres karakterlánc lesz.
Túlterhelt testvér
A String osztálynak van egy másik felosztási metódusa a következő aláírással:
String[] split(String regex, int limit)
Ennek a metódusnak van egy további limitparamétere is: ez határozza meg, hogy a regex minta hányszor kerüljön alkalmazásra az eredeti karakterláncra. Lásd az alábbi magyarázatokat:
határ > 0
A minta alkalmazási határértéke -1 alkalommal. Ráadásul a visszaadott tömb hossza nem haladja meg a limit paraméter értékét. A tömb utolsó eleme a karakterlánc azon része lesz, amely az utolsó helyet követi, ahol a határolót megtalálták. Példa:
public class Main {
public static void main(String[] args) {
print("I love Java".split(" ", 1));
print("I love Java".split(" ", 2));
/*
Output:
[I love Java]
[I, love Java]
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
határ < 0
A határoló reguláris kifejezés a lehető legtöbbször kerül alkalmazásra a karakterláncra. A kapott tömb bármilyen hosszúságú lehet. Példa:
public class Main {
public static void main(String[] args) {
// Note the space at the end of the string
print("I love Java ".split(" ", -1));
print("I love Java ".split(" ", -2));
print("I love Java ".split(" ", -12));
/*
Output:
[I, love, Java, ]
[I, love, Java, ]
[I, love, Java, ]
Please note that the last element of the array is
an empty string. This is caused by the whitespace
at the end of the original string.
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
határ = 0
Akárcsak abban az esetben, ha limit < 0, a határoló mintát a lehető legtöbbször alkalmazzuk a karakterláncra. A végső tömb bármilyen hosszúságú lehet. Ha az utolsó elemek üres karakterláncok, akkor a rendszer kihagyja őket a végső tömbből. Példa:
public class Main {
public static void main(String[] args) {
// Note the space at the end of the string
print("I love Java ".split(" ", 0));
print("I love Java ".split(" ", 0));
print("I love Java ".split(" ", 0));
/*
Output:
[I, love, Java]
[I, love, Java]
[I, love, Java]
Note the absence of empty strings at the end of the arrays
*/
}
static void print(String[] arr) {
System.out.println(Arrays.toString(arr));
}
}
Ha megnézzük a split metódus egyparaméteres változatának megvalósítását , akkor láthatjuk, hogy olyan, mint a túlterhelt testvére, de a második argumentum nullára van állítva:
public String[] split(String regex) {
return split(regex, 0);
}
Különféle példák
A valós gyakorlatban néha megesik, hogy bizonyos szabályok szerint generált karakterláncaink vannak. Egy ilyen karakterlánc bárhonnan bekerülhet a programunkba:- harmadik féltől származó szolgáltatástól;
- szerverünknek küldött kérésből;
- konfigurációs fájlból;
- stb.
user_id|user_login|user_email
Vegyünk példának néhány konkrét értéket:
135|bender|bender@gmail.com
Tegyük fel, hogy a programozó feladata egy olyan metódus megírása, amely e-mailt küld a felhasználónak. A programozó hozzáfér a felhasználói adatokhoz, amelyeket a fent megadott formátumban rögzít. Az a részfeladat, amelyet most folytatni fogunk, az az e-mail cím elkülönítése a felhasználói adatok többi részétől. Ez az egyik olyan eset, amikor a felosztási módszer hasznos lehet. Végül is, ha megnézzük a felhasználói adatsablont, rájövünk, hogy a felhasználó e-mail-címének kinyerése a többiből olyan egyszerű, mint a split metódus meghívása a karakterlánc felosztására. Ekkor az e-mail cím a kapott tömb utolsó elemében lesz. Íme egy példa egy olyan módszerre, amely egy felhasználói adatokat tartalmazó karakterláncot vesz fel, és visszaadja a felhasználó e-mail címét. Az egyszerűség kedvéért tegyük fel, hogy az adatkarakterlánc mindig a kívánt formátumban van:
public class Main {
public static void main(String[] args) {
String userInfo = "135|bender|bender@gmail.com";
System.out.println(getUserEmail(userInfo));
// Output: bender@gmail.com
}
static String getUserEmail(String userInfo) {
String[] data = userInfo.split("\\|");
return data[2]; // or data[data.length - 1]
}
}
Figyelje meg a határolót: "\\|" . A reguláris kifejezésekben "|" egy speciális, különleges jelentésű karakter, tehát ha egy közönséges karaktert akarunk használni (azaz amit az eredeti karakterláncban szeretnénk megtalálni), akkor a karaktert két fordított perjellel meg kell szöknünk. Vegyünk egy másik példát. Tegyük fel, hogy a következőképpen felépített rendelési információink vannak:
cikkszám_1,cikk_neve_1,cikk_ára_1;cikkszám_2,cikk_neve_2,cikk_ára_2;...;cikkszám_n,cikk_neve_n,cikk_ára_n
Vagy akár elfogadhatunk néhány konkrét értéket is:
1,uborka,2,39;2,paradicsom,1,89;3,bacon,4,99
A mi feladatunk a megrendelés teljes költségének kiszámítása. Itt többször kell alkalmazni a split módszert. Az első lépés a karakterlánc felosztása a ";" használatával határolóként, hogy alkotórészeire bontsa. Ekkor minden eredményül kapott részkarakterlánc egy külön termékről tartalmaz információkat, amelyeket később feldolgozhatunk. Ezután minden terméknél szétválasztjuk a megfelelő információkat a "," szimbólum segítségével. Az eredményül kapott string tömbből kiveszünk egy adott indexű elemet (azt, ahol a termék ára tárolva van), átalakítjuk numerikus formára, és összeszámoljuk a rendelés összköltségét. Írjunk egy módszert, amely elvégzi az összes számítást:
public class Main {
public static void main(String[] args) {
String orderInfo = "1,cucumbers,2.39;2,tomatoes,1.89;3,bacon,4.99";
System.out.println(getTotalOrderAmount(orderInfo));
// Output: 9.27
}
static double getTotalOrderAmount(String orderInfo) {
double totalAmount = 0d;
final String[] items = orderInfo.split(";");
for (String item : items) {
final String[] itemInfo = item.split(",");
totalAmount += Double.parseDouble(itemInfo[2]);
}
return totalAmount;
}
}
Nézze meg, ki tudja-e találni, hogyan működik ez a módszer egyedül. A példák alapján azt mondhatjuk, hogy a split módszert akkor használjuk, ha néhány adatunk sztringként van formázva, és abból bizonyos specifikusabb információkat kell kinyernünk.
Összegzés
Megvizsgáltuk a String osztály split metódusát . Pont erre van szüksége, ha egy karakterláncot egy speciális határoló segítségével kell részekre bontani. A metódus sztringek tömbjét adja vissza (az eredeti karakterláncot alkotó részkarakterláncokat). Olyan reguláris kifejezést fogad el, amelynek egyezései a határoló karakter(eke)t jelentik. Megvizsgáltuk ennek a módszernek a különféle finomságait:- vezető határoló;
- két paraméterrel túlterhelt testvére.
GO TO FULL VERSION