Hãy nói về phương thức String.split của Java : nó làm gì và tại sao nó lại cần thiết. Không khó để đoán rằng nó phân tách một chuỗi Java, nhưng nó hoạt động như thế nào trong thực tế? Hãy đi sâu vào hoạt động của phương pháp và thảo luận về một số chi tiết không rõ ràng. Đồng thời, chúng ta sẽ tìm hiểu xem Chuỗi thực sự có bao nhiêu phương thức phân chia . Đi nào!
Lưu ý sự khác biệt giữa hai hàng cuối cùng trong bảng trên. Trong hàng thứ hai đến hàng cuối cùng, dấu phẩy được sử dụng làm dấu phân cách. Kết quả là khi chuỗi được tách ra, một số từ có dấu cách ở đầu. Ở hàng cuối cùng, chúng tôi đã sử dụng dấu phẩy và khoảng trắng làm dấu phân cách. Đó là lý do tại sao không có chuỗi con nào có khoảng trắng ở đầu trong mảng kết quả. Đây chỉ là một chi tiết tinh tế chứng tỏ tầm quan trọng của việc cẩn thận chọn đúng dấu phân cách.
Mô tả và chữ ký cho String.split của Java
Trong Java, phương thức split 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 xác định bằng biểu thức chính quy. Hãy trình bày chữ ký của phương thức và bắt đầu phần đi sâu của chúng tôi:
String[] split(String regex)
Hai điều rõ ràng từ chữ ký:
- Phương thức trả về một mảng các chuỗi.
- Phương thức này có một tham số đầu vào chuỗi được gọi là regex .
-
Phương thức trả về một mảng các chuỗi.
Phần khai báo chứa các từ sau: "Trong Java, phương thức split tách một chuỗi thành các chuỗi con." Phương thức thu thập các chuỗi con này thành một mảng trở thành giá trị trả về.
-
Phương thức này có một tham số đầu vào chuỗi được gọi là regex .
Một lần nữa, hãy nhớ lại mô tả: "tách 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 xác định bằng biểu thức chính quy." Tham số đầu vào regex là một biểu thức chính quy được áp dụng cho chuỗi gốc. Khi ký tự hoặc tổ hợp ký tự khớp nhau, chúng được coi là dấu phân cách.
Sự phân chia của Java trong thực tế
Bây giờ chúng ta hãy tiến gần hơn đến vấn đề. Hãy tưởng tượng chúng ta có một chuỗi 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 tôi thấy rằng các từ trong chuỗi này được phân tách với nhau bằng dấu cách. Trong trường hợp này, một ký tự khoảng trắng là ứng cử viên hoàn hảo cho dấu phân cách của chúng ta. Mã để giải quyết nhiệm vụ của chúng tôi sẽ như thế này:
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
Hãy xem thêm một vài ví dụ về cách thức hoạt động của phương thức split :
Sợi dây | 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" , "tình 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" } |
Dấu phân cách hàng đầu
Đây là một sắc thái quan trọng khác. Nếu chuỗi ban đầu 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à một chuỗi rỗng. Ví dụ, nó sẽ trông như thế này: Chuỗi gốc: " I love Java" Dấu phân cách: " " Mảng kết quả: { "", "I", "love", "Java" } Nhưng nếu chuỗi gốc kết thúc bằng dấu phân cách thì đúng hơn hơn là bắt đầu bằng một, thì kết quả sẽ khác: Chuỗi gốc: "I love Java " Dấu phân cách: " " Mảng kết quả: { "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));
}
}
Đầu ra của phương thức chính sẽ như thế này:
[Tôi, yêu, Java]
[, tôi, yêu, Java]
[Tôi, yêu, Java]
[, tôi, yêu, Java]
Một lần nữa, hãy chú ý đến thực tế là khi ký tự đầu tiên trong chuỗi gốc là ký tự phân cách, thì kết quả là phần tử đầu tiên trong mảng sẽ là một chuỗi rỗng.
anh chị em quá tải
Lớp String có một phương thức phân tách khác với chữ ký sau:
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 gốc. Xem các giải thích dưới đây:
giới hạn > 0
Mẫu được áp dụng giới hạn -1 lần. Hơn nữa, độ dài của mảng được trả về sẽ không vượt quá giá trị của tham số giới hạn . Phần tử cuối cùng của mảng sẽ là một phần của chuỗi theo sau vị trí cuối cùng mà dấu phân cách đượ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
Biểu thức chính quy 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ỳ. Ví dụ:
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));
}
}
giới hạn = 0
Đối với trường hợp 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 cuối cùng có thể có độ dài bất kỳ. Nếu các phần tử cuối cùng là các chuỗi rỗng, chúng sẽ bị loại bỏ khỏi mảng cuối cùng. Ví dụ:
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));
}
}
Nếu chúng ta xem qua việc triển khai phiên bản một tham số của phương thức phân tách , thì chúng ta có thể thấy rằng nó giống như người anh em bị quá tải của nó, nhưng với đối số thứ hai được đặt thành 0:
public String[] split(String regex) {
return split(regex, 0);
}
ví dụ khác nhau
Trong thực tế, đôi khi chúng ta có các chuỗi được tạo theo các quy tắc nhất định. Một chuỗi như vậy có thể xuất hiện trong 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 được gửi đến máy chủ của chúng tôi;
- từ một tệp cấu hình;
- và như thế.
user_id|user_login|user_email
Hãy lấy một số giá trị cụ thể làm ví dụ:
135|bender|bender@gmail.com
Giả sử nhiệm vụ của lập trình viên là viết một phương thức gửi email cho người dùng. Lập trình viên có quyền truy cập vào dữ liệu người dùng, được ghi lại ở định dạng nêu trên. Nhiệm vụ con mà bây giờ chúng ta sẽ tiếp tục phân tích là cách tách địa chỉ email khỏi phần còn lại của dữ liệu người dùng. Đây là một trường hợp mà phương pháp tách có thể hữu ích. Rốt cuộc, nếu chúng ta nhìn vào mẫu dữ liệu người dùng, chúng ta sẽ nhận ra rằng việc trích xuất địa chỉ email của người dùng từ phần còn lại cũng đơn giản như gọi phương thức phân tách để phân tách chuỗi. Sau đó, địa chỉ email sẽ nằm trong phần tử cuối cùng của mảng kết quả. Dưới đây là một ví dụ về phương pháp lấy một chuỗi chứa dữ liệu người dùng và trả về địa chỉ email của người dùng. Để đơn giản, giả sử rằng chuỗi dữ liệu luôn ở định dạng mà chúng ta muố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: "\\|" . Trong biểu thức chính quy, "|" là một ký tự đặc biệt có ý nghĩa đặc biệt, vì vậy nếu chúng ta muốn sử dụng nó một ký tự bình thường (tức là thứ chúng ta muốn tìm trong chuỗi gốc), thì chúng ta cần thoát ký tự bằng hai dấu gạch chéo ngược. Hãy xem xét một ví dụ khác. Giả sử chúng ta có thông tin đặt hàng được cấu trúc như sau:
mặt_hàng_1,tên_mặt_hàng_1,giá_mặt_hàng_1;số_mặt_hàng_2,tên_mặt_hàng_2,giá_mặt_hàng_2;...;số_mặt_hàng_n,tên_mặt_hàng_n,giá_n_mặt_hàng
Hoặc thậm chí chúng ta có thể áp dụng một số giá trị cụ thể:
1,dưa chuột,2,39;2,cà chua,1,89;3,thịt xông khói,4,99
Nhiệm vụ của chúng ta là tính tổng chi phí của đơn hàng. Ở đây chúng ta sẽ phải áp dụng phương pháp tách nhiều lần. Bước đầu tiên là tách chuỗi bằng dấu ";" làm dấu phân cách để chia nó thành các phần cấu thành của nó. Sau đó, mỗi chuỗi con kết quả sẽ chứa thông tin về một sản phẩm riêng biệt mà chúng tôi có thể xử lý sau. Sau đó, với mỗi sản phẩm, chúng tôi sẽ tách ra các thông tin tương ứng bằng ký hiệu ",". Chúng tôi sẽ lấy một phần tử có chỉ số cụ thể (phần tử lưu trữ giá sản phẩm) từ mảng chuỗi kết quả, chuyển đổi nó thành dạng số và tính tổng chi phí của đơn đặt hàng. Hãy viết một phương thức sẽ thực hiện tất cả các phép tính này:
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;
}
}
Xem liệu bạn có thể tự mình tìm ra cách thức hoạt động của phương pháp này hay không. Dựa trên những ví dụ này, chúng ta có thể nói rằng phương pháp phân tách được sử dụng khi chúng ta có một số dữ liệu được định dạng dưới dạng chuỗi và chúng ta cần trích xuất một số thông tin cụ thể hơn từ nó.
Bản tóm tắt
Chúng ta đã kiểm tra phương thức split của lớp String . Đó chính là thứ bạn cần khi bạn phải tách một chuỗi thành các phần cấu thành của nó với sự trợ giúp của một 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 chuỗi con bao gồm chuỗi gốc). Nó chấp nhận một biểu thức chính quy có các kết quả phù hợp đại diện cho (các) ký tự dấu phân cách. Chúng tôi đã kiểm tra sự tinh tế khác nhau của phương pháp này:- một dấu phân cách hàng đầu;
- anh chị em quá tải của nó với hai tham số.
GO TO FULL VERSION