JavaRush /Blog Java /Random-MS /Kaedah pisah dalam Java: bahagikan rentetan kepada bahagi...

Kaedah pisah dalam Java: bahagikan rentetan kepada bahagian

Diterbitkan dalam kumpulan
Mari kita bincangkan tentang kaedah split String : apa yang dilakukan dan mengapa ia diperlukan. Mudah untuk meneka bahawa ia membahagikan rentetan, tetapi bagaimanakah ia berfungsi dalam amalan? Mari kita lihat dengan lebih dekat cara kaedah itu berfungsi dan bincangkan beberapa butiran yang tidak jelas, dan pada masa yang sama ketahui berapa banyak kaedah split sebenarnya ada dalam kelas String . Mari pergi!

Definisi dan tandatangan untuk Java String.split

Kaedah split dalam Java membahagikan rentetan kepada subrentetan menggunakan pembatas yang ditentukan menggunakan ungkapan biasa. Mari berikan tandatangan kaedah dan mulakan penyelaman kami:
String[] split(String regex)
Dua perkara jelas daripada tandatangan:
  1. Kaedah ini mengembalikan tatasusunan rentetan.
  2. Kaedah ini mengambil rentetan regex sebagai parameter.
Mari kita lihat setiap perkara secara berasingan dari segi definisi yang diberikan di atas.
  1. Kaedah ini mengembalikan tatasusunan rentetan.

    Takrifan mengandungi perkataan berikut: " Kaedah split dalam Java membahagikan rentetan kepada subrentetan." Subrentetan ini dikumpul melalui kaedah ke dalam tatasusunan dan mewakili nilai pulangannya.

  2. Kaedah ini mengambil rentetan regex sebagai parameter.

    Sekali lagi, ingat definisi: "memisahkan rentetan kepada subrentetan menggunakan pembatas yang ditentukan menggunakan ungkapan biasa." Parameter regex yang diterima ialah corak ungkapan biasa yang digunakan pada rentetan sumber dan sepadan dengan aksara pembatas (atau gabungan aksara) dalam rentetan sumber.

Kaedah pisah dalam Java: bahagikan rentetan kepada bahagian - 1

Berpecah dalam amalan

Sekarang mari kita turun ke perniagaan. Mari kita bayangkan bahawa kita mempunyai rentetan dengan kata-kata. Sebagai contoh, seperti ini:
Saya suka Java
Kita perlu memecahkan rentetan menjadi perkataan. Kita melihat bahawa dalam baris ini perkataan dipisahkan antara satu sama lain dengan ruang. Ruang adalah calon yang ideal untuk peranan pemisah dalam kes ini. Inilah rupa kod untuk menyelesaikan masalah ini:
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);
        }
    }
}
Output kaedah utama adalah baris berikut:
Saya suka Java
Mari lihat beberapa lagi contoh bagaimana kaedah split akan berfungsi :
Talian pembatas Hasil kaedah
"Saya suka Jawa" " " (aksara ruang) { "Saya" , "cinta" , "Jawa" }
"192.168.0.1:8080" ":" { "192.168.0.1" , "8080" }
"Merah, oren, kuning" "," { "Merah" , "oren" , "kuning" }
"Merah, oren, kuning" "," { "Merah" , "oren" , "kuning" }
Perhatikan perbezaan antara dua baris terakhir dalam jadual di atas. Dalam baris kedua terakhir, pembatas ialah koma, jadi baris itu dipecahkan sedemikian rupa sehingga sesetengah perkataan mempunyai ruang hadapan. Dalam baris terakhir, kami menggunakan koma dan aksara ruang sebagai pembatas. Oleh itu, tatasusunan yang terhasil tidak mengandungi sebarang baris dengan ruang utama. Ini hanyalah butiran kecil yang menunjukkan betapa pentingnya memilih pemisah yang betul dengan teliti.

Pembatas utama

Terdapat satu lagi nuansa penting. Jika rentetan sumber bermula dengan pembatas, elemen pertama tatasusunan yang terhasil ialah rentetan kosong. Dalam contoh, ia akan kelihatan seperti ini: Rentetan sumber: "Saya suka Java" Pembatas: " " Tatasusunan terhasil: { "" , "I" , "love" , "Java" } Tetapi jika rentetan sumber berakhir dengan pembatas dan tidak bermula, hasilnya akan berbeza: Rentetan sumber: "Saya suka Java" Pemisah: " " Tatasusunan terhasil: { "I" , "love" , "Java" } Kami melihat dalam kod pada variasi kaedah split dengan aksara pemisah pada akhir dan/atau permulaan rentetan sumber :
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));
    }
}
Output kaedah utama adalah seperti ini:
[I, love, Java] [, I, love, Java] [I, love, Java] [, I, love, Java]
Perhatikan sekali lagi bahawa apabila aksara pertama dalam rentetan sumber ialah aksara pembatas, tatasusunan yang terhasil akan mempunyai rentetan kosong sebagai elemen pertamanya.

Rakan yang terlebih beban

Kelas String mempunyai kaedah split lain dengan tandatangan ini:
String[] split(String regex, int limit)
Kaedah ini mempunyai parameter had tambahan : ia menentukan bilangan kali corak regex akan digunakan pada rentetan sumber. Di bawah adalah penjelasan:

had > 0

had -1 kali digunakan . Dalam kes ini, panjang tatasusunan tidak akan melebihi nilai had . Elemen terakhir tatasusunan akan menjadi bahagian rentetan berikutan pembatas terakhir ditemui. Contoh:
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));
    }
}

had < 0

Corak carian pembatas digunakan pada rentetan seberapa banyak yang mungkin. Panjang tatasusunan yang terhasil boleh menjadi apa-apa. Contoh:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        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, ]

        Note that the last element of the array is
        an empty string, resulting from the space
        at the end of the original string.
        */
    }

    static void print(String[] arr) {
        System.out.println(Arrays.toString(arr));
    }
}

had 0

Seperti had < 0, corak pembatas digunakan pada rentetan seberapa banyak yang mungkin. Tatasusunan yang terhasil boleh dari sebarang panjang. Jika elemen terakhir adalah sama dengan rentetan kosong, ia akan dibuang dalam tatasusunan akhir. Contoh:
public class Main {
    public static void main(String[] args) {
        // Notice the space at the end of the line
        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));
    }
}
Jika kita melihat pelaksanaan kaedah perpecahan dengan satu hujah, kita melihat bahawa kaedah ini memanggil saudaranya yang terlampau beban dengan hujah kedua sifar:
public String[] split(String regex) {
    return split(regex, 0);
}

Pelbagai contoh

Dalam amalan kerja, kadang-kadang berlaku bahawa kami mempunyai baris yang disusun mengikut peraturan tertentu. Baris ini boleh "masuk" ke dalam program kami dari mana-mana sahaja:
  • daripada perkhidmatan pihak ketiga;
  • daripada permintaan kepada pelayan kami;
  • daripada fail konfigurasi;
  • dan lain-lain.
Biasanya dalam keadaan sedemikian pengaturcara mengetahui "peraturan permainan". Katakan pengaturcara tahu bahawa dia mempunyai maklumat tentang pengguna, yang disimpan mengikut corak ini:
user_id|user_login|user_email
Sebagai contoh, mari kita ambil nilai tertentu:
135|bender|bender@gmail.com
Dan kini pengaturcara berhadapan dengan tugas menulis kaedah yang menghantar e-mel kepada pengguna. Pada pelupusannya adalah maklumat tentang pengguna, direkodkan dalam format di atas. Nah, subtugas yang kami akan terus menganalisis adalah untuk mengasingkan alamat e-mel daripada maklumat umum tentang pengguna. Ini adalah satu contoh di mana kaedah split boleh berguna. Lagipun, jika kami melihat templat, kami faham bahawa untuk mengekstrak alamat e-mel pengguna daripada semua maklumat, kami hanya perlu memisahkan baris menggunakan kaedah split . Kemudian alamat e-mel akan berada dalam elemen terakhir tatasusunan yang terhasil. Mari kita berikan contoh kaedah sedemikian, yang mengambil rentetan yang mengandungi maklumat tentang pengguna dan mengembalikan e-mel pengguna. Untuk memudahkan, mari kita anggap bahawa rentetan ini sentiasa sepadan dengan format yang kita perlukan:
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]
    }
}
Perhatikan pemisah: "\\|" . Sejak dalam ungkapan biasa "|" - ini ialah watak khas yang mana logik tertentu terikat; untuk menggunakannya sebagai watak biasa (yang kita ingin cari dalam rentetan sumber), kita perlu melarikan diri daripada watak ini menggunakan dua garis miring ke belakang. Mari kita lihat contoh lain. Katakan kami mempunyai maklumat tentang pesanan, yang ditulis dalam kira-kira format ini:
item_number_1, item_name_1, item_price_1; item_nomber_2, item_name_2, item_price_2;...;item_number_n, item_name_n, item_price_n
Atau mari kita ambil nilai tertentu:
1, timun, 20.05; 2, tomato, 123.45; 3, arnab, 0.50
Kami berhadapan dengan tugas untuk mengira jumlah kos pesanan. Di sini kita perlu menggunakan kaedah split beberapa kali. Langkah pertama ialah membelah rentetan melalui simbol ";" kepada bahagian komponennya. Kemudian dalam setiap bahagian tersebut kami akan mempunyai maklumat tentang produk individu, yang boleh kami proses pada masa hadapan. Dan kemudian, dalam setiap produk, kami akan memisahkan maklumat menggunakan simbol "," dan mengambil daripada tatasusunan yang terhasil elemen dengan indeks tertentu (di mana harga disimpan), menukarnya kepada bentuk angka dan menyusun kos akhir daripada perintah itu. Mari tulis kaedah yang akan mengira semua ini:
public class Main {
    public static void main(String[] args) {
        String orderInfo = "1, cucumbers, 20.05; 2, tomatoes, 123.45; 3, hares, 0.50";
        System.out.println(getTotalOrderAmount(orderInfo));
        // Output: 144.0
    }

    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;
    }
}
Cuba fikirkan sendiri bagaimana kaedah ini berfungsi. Berdasarkan contoh ini, kita boleh mengatakan bahawa kaedah split digunakan apabila kita mempunyai beberapa maklumat dalam bentuk rentetan, yang mana kita perlu mengeluarkan beberapa maklumat yang lebih khusus.

Keputusan

Kami melihat kaedah perpecahan kelas String . Ia diperlukan untuk membelah rentetan kepada bahagian komponennya menggunakan pembatas khas. Kaedah ini mengembalikan tatasusunan rentetan (komponen rentetan). Menerima ungkapan biasa yang sepadan dengan aksara pembatas. Kami melihat pelbagai kehalusan kaedah ini:
  • watak pembatas terkemuka;
  • abang sarat dengan dua hujah.
Kami juga cuba mensimulasikan beberapa situasi "kehidupan sebenar" di mana kami menggunakan kaedah perpecahan untuk menyelesaikan walaupun masalah rekaan, tetapi agak realistik.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION