CodeGym /Java blog /Véletlen /Java String.split() metódus
John Squirrels
Szint
San Francisco

Java String.split() metódus

Megjelent a csoportban
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!

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:
  1. A metódus egy karakterlánc-tömböt ad vissza.
  2. A metódusnak van egy regex nevű karakterlánc bemeneti paramétere .
Elemezzük ezeket külön-külön, a fentebb leírt leírások bontása során.
  1. 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.

  2. 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 String.split() metódus Java-ban: egy karakterlánc felosztása részekre - 1

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 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" }
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.

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 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.
Ilyen helyzetekben a programozó általában ismeri a „játékszabályokat”. Tegyük fel, hogy egy programozó tudja, hogy a következő minta szerint tárolt felhasználói információkkal foglalkozik:
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.
Megpróbáltunk modellezni néhány valós élethelyzetet is, ahol a split módszert alkalmaztuk hipotetikus, de meglehetősen reális problémák megoldására.
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION