JavaRush /Blog Java /Random-VI /Phương thức phân tách trong Java: chia chuỗi thành nhiều ...

Phương thức phân tách trong Java: chia chuỗi thành nhiều phần

Xuất bản trong nhóm
Hãy nói về phương thức phân tách Chuỗi : nó làm gì và tại sao lại cần thiết. Thật dễ dàng để đoán rằng nó chia chuỗi, nhưng nó hoạt động như thế nào trong thực tế? Chúng ta hãy xem xét kỹ hơn cách hoạt động của phương thức này và thảo luận về một số chi tiết không rõ ràng, đồng thời tìm hiểu xem thực sự có bao nhiêu phương thức phân tách trong lớp String . Đi nào!

Định nghĩa và chữ ký cho Java String.split

Phương thức phân tách trong Java chia một chuỗi thành các chuỗi con bằng cách sử dụng dấu phân cách được chỉ định bằng biểu thức chính quy. Hãy đưa ra chữ ký phương thức và bắt đầu quá trình tìm hiểu của chúng tôi:
String[] split(String regex)
Hai điều rõ ràng từ chữ ký:
  1. Phương thức trả về một mảng các chuỗi.
  2. Phương thức này lấy một chuỗi biểu thức chính quy làm tham số.
Chúng ta hãy xem xét từng điều một cách riêng biệt theo định nghĩa được đưa ra ở trên.
  1. Phương thức trả về một mảng các chuỗi.

    Định nghĩa chứa các từ sau: “ Phương thức phân tách trong Java chia một chuỗi thành các chuỗi con”. Các chuỗi con này được phương thức thu thập thành một mảng và biểu thị giá trị trả về của nó.

  2. Phương thức này lấy một chuỗi biểu thức chính quy làm tham số.

    Một lần nữa, hãy nhớ định nghĩa: “chia một chuỗi thành các chuỗi con bằng cách sử dụng dấu phân cách được chỉ định bằng biểu thức chính quy”. Tham số biểu thức chính quy được chấp nhận là mẫu biểu thức chính quy được áp dụng cho chuỗi nguồn và khớp với ký tự phân cách (hoặc tổ hợp các ký tự) trong chuỗi nguồn.

Phương thức Split trong Java: chia chuỗi thành nhiều phần - 1

Phân chia trong thực tế

Bây giờ chúng ta hãy bắt tay vào công việc. Hãy tưởng tượng rằng chúng ta có một chuỗi các từ. Ví dụ như thế này:
Tôi yêu Java
Chúng ta cần chia chuỗi thành các từ. Chúng ta thấy ở dòng này các từ cách nhau bằng dấu cách. Space là một ứng cử viên lý tưởng cho vai trò phân cách trong trường hợp này. Đây là mã để giải quyết vấn đề này trông như thế nào:
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);
        }
    }
}
Đầu ra của phương thức chính sẽ là các dòng sau:
Tôi yêu Java
Chúng ta hãy xem thêm một vài ví dụ về cách hoạt động của phương thức phân tách :
Đường kẻ Dấu phân cách Kết quả của phương pháp
"Tôi yêu Java" " " (ký tự khoảng trắng) { "Tôi" , "yêu" , "Java" }
"192.168.0.1:8080" ://:> { "192.168.0.1" , "8080" }
"Đỏ, cam, vàng" "," { "Đỏ" , "cam" , "vàng" }
"Đỏ, cam, vàng" "," { "Đỏ" , "cam" , "vàng" }
Lưu ý sự khác biệt giữa hai hàng cuối cùng trong bảng trên. Ở dòng áp chót, dấu phân cách là dấu phẩy nên dòng được phân chia sao cho một số từ có dấu cách ở đầu. Ở dòng cuối cùng, chúng tôi đã sử dụng dấu phẩy và ký tự khoảng trắng làm dấu phân cách. Do đó, mảng kết quả không chứa bất kỳ dòng nào có khoảng trắng ở đầu. Đây chỉ là một chi tiết nhỏ cho thấy tầm quan trọng của việc lựa chọn cẩn thận dấu phân cách chính xác.

Dấu phân cách hàng đầu

Có một sắc thái quan trọng hơn. Nếu chuỗi nguồn bắt đầu bằng dấu phân cách thì phần tử đầu tiên của mảng kết quả sẽ là chuỗi trống. Trong một ví dụ, nó sẽ trông như thế này: Chuỗi nguồn: "I love Java" Dấu phân cách: " " Mảng kết quả: { "" , "I" , "love" , "Java" } Nhưng nếu chuỗi nguồn kết thúc bằng dấu phân cách và không bắt đầu, kết quả sẽ khác: Chuỗi nguồn: "I love Java" Dấu phân cách: " " Mảng kết quả: { "I" , "love" , "Java" } Chúng tôi xem xét các biến thể của phương thức phân tách trong mã có ký tự phân cách ở cuối và/hoặc đầu chuỗi nguồn:
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));
    }
}
Đầu ra của phương thức chính sẽ như thế này:
[Tôi, tình yêu, Java] [, tôi, tình yêu, Java] [Tôi, tình yêu, Java] [, tôi, tình yêu, Java]
Một lần nữa lưu ý rằng khi ký tự đầu tiên trong chuỗi nguồn là ký tự phân cách, mảng kết quả sẽ có chuỗi trống làm phần tử đầu tiên.

đồng nghiệp quá tải

Lớp String có một phương thức phân tách khác có chữ ký này:
String[] split(String regex, int limit)
Phương thức này có một tham số giới hạn bổ sung : nó xác định số lần mẫu biểu thức chính quy sẽ được áp dụng cho chuỗi nguồn. Dưới đây là những lời giải thích:

giới hạn > 0

giới hạn -1 lần được áp dụng . Trong trường hợp này, độ dài của mảng sẽ không vượt quá giá trị giới hạn . Phần tử cuối cùng của mảng sẽ là phần của chuỗi theo dấu phân cách cuối cùng được tìm thấy. Ví dụ:
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));
    }
}

giới hạn < 0

Mẫu tìm kiếm dấu phân cách được áp dụng cho chuỗi nhiều lần nhất có thể. Độ dài của mảng kết quả có thể là bất kỳ. Ví dụ:
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));
    }
}

giới hạn 0

Giống như giới hạn < 0, mẫu dấu phân cách được áp dụng cho chuỗi nhiều lần nhất có thể. Mảng kết quả có thể có độ dài bất kỳ. Nếu các phần tử cuối cùng bằng chuỗi rỗng thì chúng sẽ bị loại bỏ trong mảng cuối cùng. Ví dụ:
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));
    }
}
Nếu chúng ta xem xét việc triển khai phương thức phân tách với một đối số, chúng ta sẽ thấy rằng phương thức này gọi phương thức quá tải của nó với đối số thứ hai bằng 0:
public String[] split(String regex) {
    return split(regex, 0);
}

Nhiều ví dụ khác nhau

Trong thực tế làm việc, đôi khi xảy ra trường hợp chúng ta có một dòng được biên soạn theo những quy tắc nhất định. Dòng này có thể “đi” vào chương trình của chúng ta từ bất cứ đâu:
  • từ dịch vụ của bên thứ ba;
  • từ một yêu cầu đến máy chủ của chúng tôi;
  • từ tập tin cấu hình;
  • vân vân.
Thông thường trong tình huống như vậy, lập trình viên sẽ biết “luật chơi”. Giả sử lập trình viên biết rằng anh ta có thông tin về người dùng, thông tin này được lưu trữ theo mẫu này:
user_id|user_login|user_email
Ví dụ: hãy lấy các giá trị cụ thể:
135|bender|bender@gmail.com
Và bây giờ lập trình viên phải đối mặt với nhiệm vụ: viết một phương thức gửi email đến người dùng. Theo ý của anh ta là thông tin về người dùng, được ghi ở định dạng trên. Chà, nhiệm vụ phụ mà chúng ta sẽ tiếp tục phân tích là tách địa chỉ email khỏi thông tin chung về người dùng. Đây là một ví dụ trong đó phương pháp phân chia có thể hữu ích. Rốt cuộc, nếu nhìn vào mẫu, chúng tôi hiểu rằng để trích xuất địa chỉ email của người dùng từ tất cả thông tin, chúng tôi chỉ cần tách dòng bằng phương pháp phân tách . Khi đó địa chỉ email sẽ nằm ở phần tử cuối cùng của mảng kết quả. Hãy đưa ra một ví dụ về phương thức như vậy, phương thức này lấy một chuỗi chứa thông tin về người dùng và trả về email của người dùng. Để đơn giản hóa, giả sử rằng chuỗi này luôn khớp với định dạng chúng ta cần:
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]
    }
}
Lưu ý dấu phân cách: "\\|" . Vì trong biểu thức chính quy “|” - đây là một ký tự đặc biệt có logic nhất định được gắn vào; để sử dụng nó như một ký tự thông thường (ký tự mà chúng ta muốn tìm trong chuỗi nguồn), chúng ta cần thoát ký tự này bằng cách sử dụng hai dấu gạch chéo ngược. Hãy xem một ví dụ khác. Giả sử chúng ta có thông tin về một đơn đặt hàng, được viết theo định dạng sau:
item_number_1,item_name_1,item_price_1;item_number_2,item_name_2,item_price_2;...;item_number_n,item_name_n,item_price_n
Hoặc hãy lấy các giá trị cụ thể:
1, dưa chuột, 20,05; 2, cà chua, 123,45; 3, thỏ rừng, 0,50
Chúng ta phải đối mặt với nhiệm vụ tính toán tổng chi phí của đơn hàng. Ở đây chúng ta sẽ phải sử dụng phương pháp tách nhiều lần. Bước đầu tiên là chia chuỗi thông qua ký hiệu ";" thành các phần cấu thành của nó. Sau đó, trong mỗi phần như vậy, chúng tôi sẽ có thông tin về một sản phẩm riêng lẻ mà chúng tôi có thể xử lý trong tương lai. Sau đó, trong mỗi sản phẩm, chúng tôi sẽ phân tách thông tin bằng ký hiệu "," và lấy từ mảng kết quả một phần tử có chỉ mục nhất định (trong đó giá được lưu trữ), chuyển đổi thành dạng số và tính giá thành cuối cùng của đơn hàng. Hãy viết một phương thức sẽ tính toán tất cả những điều này:
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;
    }
}
Hãy cố gắng tự mình tìm ra cách thức hoạt động của phương pháp này. Dựa trên những ví dụ này, chúng ta có thể nói rằng phương thức phân tách được sử dụng khi chúng ta có một số thông tin ở dạng chuỗi, từ đó chúng ta cần trích xuất một số thông tin cụ thể hơn.

Kết quả

Chúng ta đã xem xét phương thức phân tách của lớp String . Cần phải chia một chuỗi thành các phần thành phần của nó bằng dấu phân cách đặc biệt. Phương thức trả về một mảng các chuỗi (các thành phần của một chuỗi). Chấp nhận một biểu thức chính quy khớp với (các) ký tự phân cách. Chúng tôi đã xem xét sự tinh tế khác nhau của phương pháp này:
  • ký tự phân cách hàng đầu;
  • anh trai quá tải với hai đối số.
Chúng tôi cũng đã cố gắng mô phỏng một số tình huống “đời thực” trong đó chúng tôi sử dụng phương pháp phân tách để giải quyết các vấn đề tuy hư cấu nhưng khá thực tế.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION