Java - Chức năng loại bỏ các giá trị trống ở cuối của hàm split(Bug split empty strings at the end).




Hôm nay trong lúc code nhanh một chương trình nhỏ gặp một trường hợp bug có liên quan hàm split trong Java thấy cũng hay nên phân tích và viết lại.

Trường hợp xảy ra là có đoạn String được phân cách các giá trị với nhau bằng dầu chấm phẩy trong đó có những giá trị trống(ex: ABC;DEF;BDE;;;) khi dùng Split để chuyển đổi thành mảng thì các giá trị trống của cuối đoạng String sẽ không được chuyển thành một giá trị trong mảng.




Để bắt đầu phân tích bug này ta hãy xem đoạn code sau:
/**
 * @(#)Bug_Split.java
 *
 * Bug_Split application
 *
 * @author VNLIVES.NET
 * @version 1.00 2013/9/20
 */

public class Bug_Split {
   
    public static void main(String[] args) {
       
        // TODO, add your application code     
        String str_01 = "A;B;C;D;E;F;G;H;I";
        String str_02 = "A;B;C;D;E;F;G;;";
        String str_03 = "A;B;C;D;E;;;;";
       
        String[] arr_01 = str_01.split(";");
        String[] arr_02 = str_02.split(";");
        String[] arr_03 = str_03.split(";");
       
        System.out.println("Arr 01 length : " + arr_01.length);
        System.out.println("Arr 02 length : " + arr_02.length);
        System.out.println("Arr 03 length : " + arr_03.length);
       
       
    }
}

Sau khi run đoạn code trên thì ta có được kết quả như sau:
Arr 01 length : 9
Arr 02 length : 7
Arr 03 length : 5

Như ta thấy và nghĩ theo logic thì chiều dài của 3 mảng phải bằng nhau là 9, nhưng kết quả ta nhận được khi chay chương trình thì lại cho ra 3 kết quả khác nhau, tôi bị dính Bug là ngạy tại chỗ này ^^!

Sau khi tìm hiểu thì hàm Split này nó có hỗ trợ loại bỏ các giá trị mảng trống ở cuối, tức nếu có 1 hoặc nhiều mảng liên tiếp bị trống và ở vị trí cuối cùng thì split sẽ tự động loại bỏ các giá trị này.

Các bạn lưu ý điều kiện loại phải phải là giá trị ở vị trí cuối, giả sử tôi có một chuỗi là "A;B;C;D;E;;;;F", như trong chuỗi thì tôi có tới 3 giá trị trống nhưng khi dùng Split thì length của nó sẽ vẫn là 9 vì vị trí mảng trống không nằm ở vị trí cuối cùng.

Vây để giải quyển tình huống nảy phải làm như thế nào? Đơn giản tới cực kỳ chỉ cần thêm một biến vào hàm split() như sau:
        String[] arr_01 = str_01.split(";", -1);
        String[] arr_02 = str_02.split(";", -1);
        String[] arr_03 = str_03.split(";", -1);

Sau khi chỉnh sử cho đoạn code của chương trình phía trên và chạy lại thì ta được kết quả như sau:
Arr 01 length : 9
Arr 02 length : 9
Arr 03 length : 9


Hi vọng giúp ích gì đó cho các bạn gặp trường hợp tương tự mình. Có gì like nhẹ một phát nha.
















No comments:

Post a Comment