2012-02-22 37 views
47

chuyển 0 làm đối số giới hạn ngăn chặn các chuỗi rỗng, nhưng làm cách nào để ngăn chặn các chuỗi rỗng hàng đầu?Làm thế nào để ngăn chặn java.lang.String.split() từ việc tạo ra một chuỗi rỗng hàng đầu?

ví dụ

String[] test = "/Test/Stuff".split("/"); 

kết quả trong một mảng với "", "Test", "Stuff".

Yeah, tôi biết tôi có thể cuộn Tokenizer của riêng tôi ... nhưng các tài liệu API cho StringTokenizer nói

"StringTokenizer là một lớp học di sản đó được giữ lại để tương thích lý do mặc dù việc sử dụng nó không được khuyến khích ở mới mã. Chúng tôi đề nghị mà bất cứ ai tìm kiếm chức năng này sử dụng sự chia rẽ"

Trả lời

42

Tốt nhất có lẽ là chỉ để loại bỏ bất kỳ dấu phân cách hàng đầu:

String input = "/Test/Stuff"; 
String[] test = input.replaceFirst("^/", "").split("/"); 

Bạn có thể làm cho nó chung chung hơn bằng cách đặt nó trong một phương pháp:

public String[] mySplit(final String input, final String delim) 
{ 
    return input.replaceFirst("^" + delim, "").split(delim); 
} 

String[] test = mySplit("/Test/Stuff", "/"); 
0

Bạn có thể sử dụng StringTokenizer cho mục đích này ...

String test1 = "/Test/Stuff"; 
     StringTokenizer st = new StringTokenizer(test1,"/"); 
     while(st.hasMoreTokens()) 
      System.out.println(st.nextToken()); 
+2

'StringTokenizer' được đánh dấu là không được chấp nhận trong API và có thể không nên được sử dụng. –

+0

Không được dùng nữa !!! http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html –

+0

@McMillen, bạn có thể nói từ phiên bản nào không được chấp nhận. Thực ra tôi không biết điều này. –

5

Tôi không nghĩ rằng có một cách bạn có thể làm điều này với phương pháp được xây dựng trong split. Vì vậy, bạn có hai lựa chọn:

1) Thực hiện phân chia riêng bạn

2) Lặp qua mảng sau khi gọi chia và loại bỏ các yếu tố rỗng

Nếu bạn thực hiện phân chia riêng của bạn, bạn chỉ có thể kết hợp hai lựa chọn những

public List<String> split(String inString) 
{ 
    List<String> outList = new ArrayList<>(); 
    String[]  test = inString.split("/"); 

    for(String s : test) 
    { 
     if(s != null && s.length() > 0) 
      outList.add(s); 
    } 

    return outList; 
} 

hoặc bạn chỉ có thể kiểm tra các dấu phân cách là ở vị trí đầu tiên trước khi bạn gọi chia và bỏ qua những ký tự đầu tiên nếu có:

String delimiter  = "/"; 
String delimitedString = "/Test/Stuff"; 
String[] test; 

if(delimitedString.startsWith(delimiter)){ 
    //start at the 1st character not the 0th 
    test = delimitedString.substring(1).split(delimiter); 
} 
else 
    test = delimitedString.split(delimiter); 
0

Tôi nghĩ rằng bạn có trách nhiệm để xóa chuỗi trống đầu tiên theo cách thủ công. Một cách đơn giản để thực hiện việc này là -

String string, subString; 
    int index; 
    String[] test; 

    string = "/Test/Stuff"; 
    index = string.indexOf("/"); 
    subString = string.substring(index+1); 

    test = subString.split("/"); 

Điều này sẽ loại trừ chuỗi trống rỗng hàng đầu.

+0

Nhưng với mã này, nếu chuỗi đầu vào _didn't_ có dấu phân tách hàng đầu, bạn sẽ bỏ qua thành phần đầu tiên. Ví dụ: '" Kiểm tra/Stuff "' sẽ chỉ lấy một phần tử, "Nội dung". –

+0

Điểm tốt. Trong trường hợp đó, một kiểm tra bổ sung sẽ phải được thực hiện. – CodeBlue

1

Tôi nghĩ rằng không có chức năng tích hợp để xóa chuỗi trống trong Java. Bạn có thể loại bỏ chuỗi xóa trống nhưng có thể dẫn đến lỗi. Đối với an toàn, bạn có thể làm điều này bằng cách viết đoạn mã nhỏ như sau:

List<String> list = new ArrayList<String>(); 

    for(String str : test) 
    { 
    if(str != null && str.length() > 0) 
    { 
     list.add(str); 
    } 
    } 

    test = stringList.toArray(new String[list.size()]); 
19

Apache Commons có thêm một phương pháp hữu ích cho chính xác này: org.apache.commons.lang.StringUtils.split

StringUtils.split()

Trên thực tế trong công ty của chúng tôi bây giờ chúng ta thích sử dụng phương pháp này để tách trong tất cả các dự án của chúng tôi.

+1

Dường như không hỗ trợ biểu thức chính quy như phiên bản JDK. – Stephan

0

Đây là cách tôi đã giải quyết được vấn đề này. Tôi lấy chuỗi, gọi .toCharArray() trên nó để chia nó thành một mảng ký tự, và sau đó lặp qua mảng đó và thêm nó vào danh sách String của tôi (gói mỗi char với String.valueOf). Tôi tưởng tượng có một số sự cân bằng hiệu suất nhưng nó có vẻ giống như một giải pháp có thể đọc được. Hi vọng điêu nay co ich!

char[] stringChars = string.toCharArray(); 
List<String> stringList = new ArrayList<>(); 

for (char stringChar : stringChars) { 
     stringList.add(String.valueOf(stringChar)); 
} 
Các vấn đề liên quan