Tin tức và phân tích của tất cả các thiết bị di động

Tìm hiểu về chuỗi con trong Java: Hướng dẫn cơ bản

Trong bài viết này, chúng tôi sẽ giúp bạn hiểu về chuỗi con trong Java. Chúng tôi sẽ không chỉ cung cấp lời giải thích về mặt lý thuyết mà còn cung cấp các ví dụ về mã thực tế để giúp bạn hình dung. Chúng tôi sẽ hướng dẫn bạn cách tạo chuỗi con và giúp bạn tìm chuỗi con trong một chuỗi.

Nhưng trước khi tìm hiểu chúng, chúng ta cần có hiểu biết cơ bản về chuỗi con.

Chuỗi và chuỗi con là gì?

Trong ngữ cảnh của Java, một chuỗi đại diện cho một chuỗi ký tự. Mỗi chuỗi trong Java là một đối tượng. Một chuỗi trong Java có thể chứa các ký tự, ký hiệu và thậm chí cả khoảng trắng. Mặt khác, chuỗi con trong Java là một phần hoặc tập hợp con của chuỗi Java.

Ví dụ: “Geek” là chuỗi con của “newsblog.com”. Chuỗi con giúp bạn có được một phần cụ thể của chuỗi.

Nếu bạn có tên “John Doe” và chỉ muốn tên “John”, bạn có thể dễ dàng lấy nó bằng chuỗi con. Hơn nữa, vì bạn có một danh sách các tên “John, Jack, Jolly” và bạn muốn tìm hiểu xem “John” có trong đó hay không, bạn cũng có thể thực hiện việc này bằng các chuỗi con. Đây chỉ là những ví dụ. Chúng ta có thể sử dụng chuỗi con trong nhiều phép toán khác nhau khi chúng ta hiểu chúng.

Vì chúng ta đã biết khái niệm về chuỗi con trong Java nên bây giờ chúng ta hãy tìm hiểu cách tạo và làm việc với chuỗi con trong Java.

# 1. Sử dụng phương thức “chuỗi con()”.

Phương thức “substring()” cho phép chúng ta tạo chuỗi con rất dễ dàng. Nó lấy tối đa hai tham số làm đầu vào – startIndex hoặc cả startIndex và endIndex và trả về cho chúng ta chuỗi con được yêu cầu.

Tùy theo số lượng tham số mà chúng ta có thể sử dụng theo hai cách. Bây giờ chúng ta hãy tìm hiểu chúng một cách chi tiết.

chuỗi con (int startIndex)

Để bắt đầu, chúng ta có thể sử dụng một phương thức như “chuỗi con (startIndex)”. Ở đây, phương thức này lấy một giá trị nguyên làm đầu vào, trong đó đầu vào là vị trí bắt đầu của chuỗi con. Trả về một chuỗi bắt đầu từ chỉ mục bắt đầu đã cho và tiếp tục đến cuối chuỗi gốc.

Để làm ví dụ, chúng ta hãy xem đoạn mã sau:

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4)); //index of strings start from 0
    }  
   }

LỐI RA:

Given String: newsblog.pl
Substring: Flare

Từ đầu ra, chúng ta có thể thấy chuỗi đầu vào là “newsblog.pl” và giá trị trả về là chuỗi con “Flare”. Tạo một chuỗi con từ chỉ mục đã cho (4), tức là từ vị trí 5 đến cuối chuỗi.

chuỗi con(int startIndex, int endIndex)

Đây là một cách khác để sử dụng phương thức chuỗi con của lớp String. Chúng ta có thể truyền hai số nguyên cho phương thức chuỗi con. Chỉ số bắt đầu và chỉ số kết thúc. Để sử dụng điều này, chúng ta cần sử dụng một phương thức ở định dạng “chuỗi con (startIndex, endIndex)”.

Để hiểu điều này tốt hơn, chúng ta hãy xem một số mã mẫu:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareFans";    
    System.out.println("Given String: " + str);  
    System.out.println("Substring: " +str.substring(4,9));  //You get a substring starting from index no. 4 to index 8.

    }  
   }

LỐI RA:

Given String: GeekFlareFans
Substring: Flare

Như chúng ta có thể thấy, với chuỗi “GeekFlareFans”, nó sẽ xuất ra chuỗi con “Flare”. Chúng tôi đã cung cấp một chỉ số bắt đầu 4 và chỉ số cuối cùng 9. Nó bắt đầu với mục ở chỉ mục 4 và kết thúc trước 9. Lưu ý rằng nó không in mục có chỉ mục kết thúc. Nó cung cấp cho chúng ta một chuỗi con bao gồm tất cả các phần tử cho đến chỉ mục cuối, nhưng loại trừ phần tử có chỉ mục cuối.

#2. Sử dụng phương thức “split()”.

“split()” là một phương thức khác của lớp String trong Java giúp chúng ta tạo chuỗi con. Điều này rất hữu ích khi có nhiều thông tin được lưu trữ trong một chuỗi có ký tự phân cách chung.

Thuật ngữ “regex” xuất hiện trong cú pháp, điều này có vẻ hơi khó hiểu, vì vậy trước khi tiếp tục, hãy hiểu Regex là gì. Regex là viết tắt của “biểu thức chính quy”. Biểu thức chính quy là một chuỗi ký tự mô tả một mẫu trong một chuỗi hoặc văn bản. Trong ngữ cảnh của phương thức phân tách, dấu phân cách của chúng tôi là một biểu thức chính quy.

Phương thức “split()” có thể lấy tối đa hai biến làm đầu vào, chúng là một chuỗi ký tự thông thường và một số nguyên giới hạn. Biểu thức chính quy là dấu phân cách mà khi tìm thấy sẽ chia chuỗi gốc thành 2 các phần – phần trước biểu thức chính quy và phần sau biểu thức chính quy.

Ví dụ: giả sử bạn đang cố tách chuỗi “abcdef” thành “bcd” dưới dạng biểu thức chính quy. Kết quả sẽ là chuỗi con ‘a’ và ‘ef’.

Phương thức trả về một mảng có các chuỗi được phân cách. Chúng ta chỉ có thể chỉ định một biểu thức chính quy hoặc cả biểu thức chính quy và giới hạn. Hãy cùng khám phá từng cách khác nhau để gọi phương thức này.

tách (chuỗi ký tự thông thường)

Phương thức đầu tiên chỉ nhận được chuỗi biểu thức chính quy ở định dạng “split(regex)”. Không có biến giới hạn; do đó nó trả về tất cả các chuỗi con tách biệt trong mảng.

Chúng ta hãy hiểu rõ ràng về mã:

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("%");
    System.out.println("Given String: " + str);
    System.out.println("First Substring: " + substrings[0]);
    System.out.println("Second Substring: " + substrings[1]);
     
    }  
}

LỐI RA:

Given String: Geek%Flare
First Substring: Geek
Second Substring: Flare

Như chúng ta có thể thấy từ mã, chuỗi đã cho có dấu phân cách biểu thức chính quy “%”. Nó không nhất thiết phải là một ký tự đơn lẻ, nó có thể là bất kỳ chuỗi ký tự nào với số lượng ký tự bất kỳ. Phương thức “split()” bỏ qua biểu thức chính quy này và cung cấp cho chúng ta tất cả các chuỗi đã được phân tách bằng biểu thức chính quy này. Chuỗi con được lưu trữ trong một mảng.

Trong mã, chuỗi đã cho là “Geek%Flare”. Vì vậy, chúng ta nhận được một mảng chứa hai phần tử là “Geek” và “Flare”. Sau đó chúng tôi đã truy cập chúng bằng các chỉ số tương ứng 0,1và in “Geek” và “Flare” trên bảng điều khiển.

Ở đây cũng cần lưu ý rằng nếu không có tham số nào được truyền cho phương thức, nó sẽ chỉ báo lỗi. Nhưng nếu chúng ta chuyển một chuỗi trống (“”) dưới dạng biểu thức chính quy, chúng ta sẽ nhận được mọi ký tự đơn lẻ dưới dạng chuỗi con. Hãy xem một ví dụ để hình dung.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare";
    String[] substrings=str.split("");
    System.out.println(Arrays.toString(substrings));
     
    }  
}

LỐI RA:

[G, e, e, k, %, F, l, a, r, e]

Từ ví dụ, bạn có thể thấy tham số biểu thức chính quy là một chuỗi rỗng, nó trả về tất cả các ký tự dưới dạng các chuỗi con riêng biệt, có thể thấy rõ điều này bằng cách hiển thị mảng đầu ra của phương thức “split()”.

tách (chuỗi ký tự thông thường, giới hạn int)

Với biến thể thứ hai của phương pháp này, chúng tôi có nhiều quyền kiểm soát đầu ra hơn và có thể tinh chỉnh thêm đầu ra của phương thức “split()”. Ở đây phương thức “split()” lấy hai biến làm đầu vào. Trong trường hợp này, cùng với biểu thức chính quy, chúng tôi cũng cung cấp tham số giới hạn ở định dạng đã chỉ định “split(regex, limit)”.

“Giới hạn” là số lượng chuỗi kết quả được xuất ra. Tùy thuộc vào giá trị giới hạn, có thể có ba khả năng:

Trường hợp 1: nếu giới hạn>0mảng kết quả sẽ chứa đầu ra nhưng sẽ áp dụng tối đa phép chia (giới hạn-1). Ở đây, mảng kết quả sẽ không chứa nhiều phần tử hơn giới hạn đã chỉ định và tất cả chuỗi chưa phân tách còn lại sẽ được giữ nguyên. Hãy làm cho nó dễ hiểu hơn bằng mã.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%the%best";
    String[] substrings=str.split("%",2);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

LỐI RA:

[Geek, Flare%is%the%best]

Xem kết quả đầu ra chỉ có hai phần tử trong mảng kết quả, đó là số được đưa ra trong tham số giới hạn. Cũng lưu ý rằng phép chia chỉ được sử dụng một lần, đó là (giới hạn-1) lần.

Tuy nhiên, nếu biểu thức chính quy xuất hiện hai lần liên tiếp (“%%”), nó sẽ chứa các chuỗi con trống. Hãy xem đoạn mã này để hiểu rõ hơn.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",5);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

LỐI RA:

[Geek, Flare, is, , the%best%%%]

Về cơ bản, nếu theo sau “%” là một “%” khác hoặc phần cuối của chuỗi thì chuỗi đó sẽ chuyển thành chuỗi con trống.

Trường hợp 2: Nếu giới hạn <0hành động phân tách sẽ được áp dụng nhiều lần nhất có thể mà không giới hạn kích thước của mảng, nhưng mảng sẽ chứa các chuỗi con trống nếu biểu thức chính quy xuất hiện hai lần liên tiếp ("%%").

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",-1);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

LỐI RA:

[Geek, Flare, is, , the, best, , , ]

Từ đầu ra, bạn có thể thấy rằng việc phân tách được áp dụng nhiều lần nhất có thể và cũng có những chuỗi con trống.

Trường hợp 3: Nếu giới hạn=0hành động phân tách sẽ được áp dụng nhiều lần nhất có thể, nhưng ở đây tất cả các chuỗi con trống ở cuối chuỗi sẽ bị loại bỏ khỏi mảng.

import java.util.Arrays;

public class Substrings{    
    public static void main(String args[]){    
    String str="Geek%Flare%is%%the%best%%%";
    String[] substrings=str.split("%",0);
    System.out.println(Arrays.toString(substrings));
     
    }  
}

LỐI RA:

[Geek, Flare, is, , the, best]

Chúng ta có thể thấy rằng đầu ra khá giống nhau giữa các giá trị limit=-1 và giới hạn=0, nhưng không có chuỗi con trống nào ở cuối. Nói cách khác, các chuỗi con trống ở cuối mảng chuỗi con sẽ bị bỏ qua.

Cũng lưu ý rằng nếu biểu thức chính quy không có trong chuỗi thì kết quả là nó sẽ trả về toàn bộ chuỗi gốc.

Tìm xem một chuỗi có chứa chuỗi con không

Ngoài việc tạo chuỗi con từ các chuỗi hiện có, chúng ta cũng có thể xác định chuỗi con và tìm hiểu xem chuỗi con đó có tồn tại trong chuỗi hay không. Đây là cách nhanh chóng và dễ dàng để truy vấn chuỗi con, hữu ích trong nhiều trường hợp sử dụng. Nhưng làm thế nào để làm điều đó? Nhiều phương pháp khác nhau có thể giúp chúng ta điều này. Chúng ta hãy đi qua từng cái một.

Sử dụng phương thức “chứa()”:

Chúng ta có thể tìm thấy sự tồn tại của một chuỗi con rất dễ dàng bằng cách sử dụng phương thức “contains()”. Phương thức này của lớp String lấy đầu vào là một chuỗi là chuỗi con của chúng ta và trả về một boolean để kiểm tra xem chuỗi con có nằm trong chuỗi hay không. Phương pháp này có thể được sử dụng bên trong các khối if-else, toán tử đơn nguyên và nhiều nơi khác để triển khai logic phức tạp.

Chúng ta hãy tìm hiểu phương pháp này chi tiết hơn.

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Does it contain Flare? \n"+ str.contains("Flare"));  
    }  
}

LỐI RA:

Does it contain Flare? 
true

Mã này kiểm tra chuỗi “newsblog.pl” để tìm từ “Flare” và trả về giá trị boolean “true” nếu tìm thấy, do đó xác nhận sự tồn tại của chuỗi con.

public class Substrings{    
    public static void main(String args[]){    
    String str="newsblog.pl";    
    System.out.println("Does it contain Flare? \n"+ str.contains("Flare1"));  
    }  
}

LỐI RA:

Does it contain Flare? 
false

Từ ví dụ, chúng ta hiểu rằng nếu chuỗi con không có trong chuỗi thì phương thức sẽ trả về false để cho biết rằng nó không tồn tại. Vì vậy, chúng ta có thể dễ dàng đảm bảo rằng chuỗi con tồn tại.

Tìm vị trí của chùm tia

# 1. Sử dụng “indexOf()”:

Phương thức “indexOf()” có thể được sử dụng để tìm chuỗi con cũng như tìm chỉ mục của nó. Phương thức này lấy một chuỗi hoặc ký tự làm đầu vào và cho chúng ta biết vị trí xuất hiện đầu tiên của nó. Nhưng nó chỉ có thể cung cấp cho chúng tôi chỉ số về lần xuất hiện đầu tiên và không thể xác nhận liệu có những lần xuất hiện khác hay không. Một điều cần lưu ý nữa, nếu chuỗi con không tồn tại, phương thức sẽ trả về -1.

Vì vậy, chúng ta hãy xem xét kỹ hơn về phương pháp này.

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Index of Flare: "+ str.indexOf("Flare"));  
    }  
}

LỐI RA:

Index of Flare: 4

Trong ví dụ này, lần xuất hiện đầu tiên của “Flare” bắt đầu ở chỉ mục 4 trong “GeekFlareGeekFlare”. Vì vậy, đúng như mong đợi, hàm trả về chỉ mục.

#2. Sử dụng “lastIndexOf()”:

‘lastIndexOf()’ rất giống với ‘indexOf()’. Cả hai phương thức này đều lấy một chuỗi con làm đầu vào và trả về chỉ mục vị trí của nó. Nó thậm chí còn có cùng giá trị trả về khi không thể tìm thấy chuỗi con trong chuỗi đã chỉ định. Cả hai phương thức này đều trả về -1 trong trường hợp không tìm được.

Nhưng trong khi “indexOf()” trả về chỉ mục của lần xuất hiện đầu tiên của chuỗi con thì “lastIndexOf()” trả về lần xuất hiện cuối cùng.

Hãy xem nó hoạt động với mã:

public class Substrings{    
    public static void main(String args[]){    
    String str="GeekFlareGeekFlare";    
    System.out.println("Last index of Flare: "+ str.lastIndexOf("Flare"));  
    }  
}

LỐI RA:

Last index of Flare:13

Quan sát kết quả này, chúng ta hiểu rằng phương thức ‘lastIndexOf()’ hoạt động như mong đợi và chúng ta nhận được chỉ mục về lần xuất hiện cuối cùng của chuỗi con “Flare” trong chuỗi “GeekFlareGeekFlare”.

Các câu hỏi thường gặp

Làm cách nào để sử dụng phương thức “split()” để tạo các chuỗi con không trống?

Nếu có nhiều lần xuất hiện của biểu thức chính quy trong chuỗi chính, lần lượt (“Xin chào%%Hi”, trong đó biểu thức chính quy là “%”), thì phương thức “split()” coi lần xuất hiện đầu tiên là dấu ngắt ký tự và phần còn lại trả về một chuỗi trống. Để giảm thiểu điều này, chúng ta có thể chỉ định tham số giới hạn là 0. Do đó, chỉ các chuỗi không trống mới được hiển thị dưới dạng đầu ra.

“indexOf()” có trả về chỉ mục của tất cả các lần xuất hiện của chuỗi con không?

Không, “indexOf()” không trả về chỉ mục của tất cả các lần xuất hiện của chuỗi con. Với ‘indexOf()’, chúng ta nhận được giá trị trả về số nguyên chứa chỉ mục lần xuất hiện đầu tiên của chuỗi con. Nhưng nếu không tìm thấy chuỗi con, phương thức sẽ trả về -1.

Phương thức “chuỗi con()” trả về giá trị gì nếu các chỉ mục đã cho không tồn tại trong chuỗi?

Nếu chỉ số bắt đầu và chỉ số kết thúc không tồn tại trong chuỗi, trình biên dịch sẽ báo lỗi. Lỗi phải chứa “java.lang.StringIndexOutOfBoundsException:” và nó sẽ không thực thi.

Ứng dụng

Trong bài viết này, chúng tôi đã đề cập đến nhiều phương pháp và kiến ​​thức cơ bản khác nhau để bắt đầu với chuỗi con. Chúng ta đã đề cập đến việc tạo chuỗi con và kiểm tra sự tồn tại của chuỗi con trong chuỗi. Điều này sẽ giúp bạn hiểu rõ hơn về cách làm việc với chuỗi con. Hãy làm theo các ví dụ và thực hành nhiều hơn để hiểu rõ hơn về chuỗi con.

Sau đó, bạn có thể xem danh sách Câu hỏi phỏng vấn Java của chúng tôi.

Mục lục