CodeGym/Blog Java/Aleatoriu/Metoda Java String.split().
John Squirrels
Nivel
San Francisco

Metoda Java String.split().

Publicat în grup
Să vorbim despre metoda String.split din Java : ce face și de ce este necesară. Nu este greu de ghicit că împarte un șir Java, dar cum funcționează acest lucru în practică? Să ne aprofundăm în funcționarea metodei și să discutăm câteva detalii neevidente. În același timp, vom afla câte metode de împărțire are de fapt șirul . Să mergem!

Descriere și semnătură pentru String.split din Java

În Java, metoda split împarte un șir în subșiruri folosind un delimitator definit folosind o expresie regulată. Să prezentăm semnătura metodei și să începem scufundarea:
String[] split(String regex)
Două lucruri sunt clare din semnătură:
  1. Metoda returnează o matrice de șiruri de caractere.
  2. Metoda are un parametru de intrare șir numit regex .
Să analizăm fiecare dintre acestea separat, în timp ce descompunem descrierea dată mai sus.
  1. Metoda returnează o matrice de șiruri de caractere.

    Declarația conține următoarele cuvinte: „În Java, metoda split împarte un șir în subșiruri”. Metoda colectează aceste subșiruri într-o matrice care devine valoarea returnată.

  2. Metoda are un parametru de intrare șir numit regex .

    Din nou, amintiți-vă descrierea: „împarte un șir în subșiruri folosind un delimitator definit folosind o expresie regulată”. Parametrul de intrare regex este o expresie regulată care este aplicată șirului original. Când caracterul sau combinația de caractere se potrivesc, acestea sunt tratate ca un delimitator.

Metoda String.split() în Java: împărțirea unui șir în părți - 1

Java este divizat în practică

Acum să ne apropiem de subiect. Să ne imaginăm că avem un șir de cuvinte. De exemplu, așa:
Iubesc Java
Trebuie să împărțim șirul în cuvinte. Vedem că cuvintele din acest șir sunt separate unul de celălalt prin spații. În acest caz, un caracter spațiu este candidatul perfect pentru delimitatorul nostru. Codul pentru rezolvarea sarcinii noastre ar arăta astfel:
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);
        }
    }
}
Rezultatul metodei principale va fi următoarele linii:
Iubesc Java
Să mai vedem câteva exemple despre cum ar funcționa metoda împărțirii :
Şir Delimitator Rezultatul metodei
„Îmi place Java” " " (caracter spațiu) { „eu” , „dragoste” , „Java” }
„192.168.0.1:8080” ":" { „192.168.0.1” , „8080” }
„Roșu, portocaliu, galben” "," { „Roșu” , „portocaliu” , „galben” }
„Roșu, portocaliu, galben” ", " { „Roșu” , „portocaliu” , „galben” }
Observați diferențele dintre ultimele două rânduri din tabelul de mai sus. În al doilea până ultimul rând, o virgulă este folosită ca delimitator. Ca rezultat, atunci când șirul este împărțit, unele dintre cuvinte au spații de început. În ultimul rând, am folosit o virgulă și un spațiu ca delimitator. De aceea, nu existau subșiruri cu spații de început în tabloul rezultat. Acesta este doar un detaliu subtil care demonstrează cât de important este să alegeți cu atenție delimitatorul potrivit.

Delimitator principal

Aceasta este o altă nuanță importantă. Dacă șirul inițial începe cu delimitator, atunci primul element al tabloului rezultat va fi un șir gol. De exemplu, ar arăta astfel: Șirul original: " I love Java" Delimitator: " " Matrice rezultată: { "", "I", "love", "Java" } Dar dacă șirul original se termină cu un delimitator, mai degrabă decât începând cu unul, atunci rezultatul va fi diferit: Șir original: „Iubesc Java „ Delimitator: „ „ Matrice rezultată: { „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));
    }
}
Rezultatul metodei principale va fi astfel:
[Eu, dragoste, Java] [, Eu, dragoste, Java] [Eu, dragoste, Java] [, Eu, dragoste, Java]
Îndreptați-vă din nou atenția asupra faptului că, atunci când primul caracter din șirul original este un caracter delimitator, atunci rezultatul este că primul element din matrice va fi un șir gol.

Frate supraîncărcat

Clasa String are o altă metodă de împărțire cu următoarea semnătură:
String[] split(String regex, int limit)
Această metodă are un parametru limită suplimentar : determină de câte ori modelul regex va fi aplicat șirului original. Vezi explicațiile de mai jos:

limita > 0

Modelul este aplicat limită -1 ori. În plus, lungimea matricei returnate nu va depăși valoarea parametrului limită . Ultimul element al tabloului va fi partea din șir care urmează ultimul loc în care a fost găsit delimitatorul. Exemplu:
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));
    }
}

limita < 0

Expresia regulată a delimitatorului este aplicată șirului de câte ori este posibil. Matricea rezultată poate avea orice lungime. Exemplu:
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));
    }
}

limita = 0

Ca și în cazul în care limită < 0, modelul delimitator este aplicat șirului de câte ori este posibil. Matricea finală poate avea orice lungime. Dacă ultimele elemente sunt șiruri goale, acestea sunt eliminate din tabloul final. Exemplu:
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));
    }
}
Dacă ne uităm la implementarea versiunii cu un parametru a metodei split , atunci putem vedea că este ca fratele său supraîncărcat, dar cu al doilea argument setat la zero:
public String[] split(String regex) {
    return split(regex, 0);
}

Diverse exemple

În practica din lumea reală, se întâmplă uneori să avem șiruri care sunt generate după anumite reguli. Un astfel de șir poate intra în programul nostru de oriunde:
  • de la un serviciu terță parte;
  • dintr-o solicitare trimisă la serverul nostru;
  • dintr-un fișier de configurare;
  • și așa mai departe.
În aceste situații, programatorul cunoaște de obicei „regulile jocului”. Să presupunem că un programator știe că el sau ea are de-a face cu informațiile utilizatorului stocate conform acestui model:
user_id|user_login|user_email
Să luăm câteva valori specifice ca exemplu:
135|bender|bender@gmail.com
Să presupunem că sarcina programatorului este să scrie o metodă care trimite un e-mail utilizatorului. Programatorul are acces la datele utilizatorului, care sunt înregistrate în formatul dat mai sus. Subsarcina pe care o vom continua acum să o analizăm este cum să izolam adresa de e-mail de restul datelor utilizatorului. Acesta este un caz în care metoda divizării poate fi utilă. La urma urmei, dacă ne uităm la șablonul de date utilizator, ne dăm seama că extragerea adresei de e-mail a utilizatorului din restul este un simplu ca apelarea metodei split pentru a împărți șirul. Apoi adresa de e-mail va fi în ultimul element al matricei rezultate. Iată un exemplu de metodă care preia un șir care conține datele utilizatorului și returnează adresa de e-mail a utilizatorului. Pentru simplitate, să presupunem că șirul de date este întotdeauna în formatul dorit:
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]
    }
}
Observați delimitatorul: "\\|" . În expresiile regulate, „|” este un caracter special cu semnificație specială, așa că dacă vrem să-l folosim un caracter obișnuit (adică ceea ce vrem să găsim în șirul original), atunci trebuie să evadăm caracterul cu două bare oblice inverse. Luați în considerare un alt exemplu. Să presupunem că avem informații despre comandă care sunt structurate astfel:
număr_articol_1,nume_articol_1,preț_articol_1;număr_articol_2,nume_articol_2,preț_articol_2;...;număr_articol_n,nume_articol_n,preț_articol_n
Sau putem chiar să adoptăm câteva valori specifice:
1,castraveti,2,39;2,rosii,1,89;3,slanina,4,99
Sarcina noastră este să calculăm costul total al comenzii. Aici va trebui să aplicăm metoda split de mai multe ori. Primul pas este să împărțiți șirul folosind „;” ca delimitator pentru a-l sparge în părțile sale componente. Apoi, fiecare subșir rezultat va conține informații despre un produs separat, pe care îl putem procesa ulterior. Apoi, pentru fiecare produs, vom împărți informațiile corespunzătoare folosind simbolul ",". Vom lua un element cu un index specific (cel în care este stocat prețul produsului) din matricea de șiruri rezultată, îl vom converti în formă numerică și vom calcula costul total al comenzii. Să scriem o metodă care va face toate aceste calcule:
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;
    }
}
Vedeți dacă vă puteți da seama cum funcționează această metodă pe cont propriu. Pe baza acestor exemple, putem spune că metoda split este folosită atunci când avem unele date formatate ca șir și trebuie să extragem anumite informații mai specifice din ea.

rezumat

Am examinat metoda split a clasei String . Este exact ceea ce aveți nevoie atunci când trebuie să împărțiți un șir în părțile sale componente cu ajutorul unui delimitator special. Metoda returnează o matrice de șiruri (subșirurile care cuprind șirul original). Acceptă o expresie regulată ale cărei potriviri reprezintă caracterul(ele) delimitator. Am examinat diverse subtilități ale acestei metode:
  • un delimitator principal;
  • fratele său supraîncărcat cu doi parametri.
De asemenea, am încercat să modelăm câteva situații din viața reală în care am folosit metoda split pentru a rezolva probleme ipotetice, dar destul de realiste.
Comentarii
  • Popular
  • Nou
  • Vechi
Trebuie să fii conectat pentru a lăsa un comentariu
Această pagină nu are încă niciun comentariu