2012-02-15 17 views
16

Tôi không nhận được như sau:Không chắc thế nào chuỗi phân chia thực sự hoạt động trong trường hợp này

Trong sau String:

String s = "1234;x;;y;";

nếu tôi làm:
String[] s2 = s.split(";");

Tôi nhận được s2.length để là 4 và

s2[0] = "1234"; 
s2[1] = "x"; 
s2[2] = ""; 
s2[3] = "y"; 

Nhưng trong chuỗi: String s = "1234;x;y;;";

tôi nhận được:

s2.length là 3 và

s2[0] = "1234"; 
s2[1] = "x"; 
s2[2] = "y"; 

?

Sự khác biệt là gì và tôi cũng không nhận được 4 trong trường hợp sau?

UPDATE:
Sử dụng -1 không được là tôi đã mong như hành vi.
Tôi có nghĩa là dấu chấm phẩy cuối cùng là kết thúc của String như vậy trong ví dụ sau tôi cũng đã mong 4 như chiều dài của mảng

+1

Câu hỏi được xây dựng kỹ lưỡng +1 –

+1

Câu hỏi của bạn chính xác là những gì được đề cập trong tài liệu (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html# chia% 28java.lang.String% 29). Vì vậy, tôi không nghĩ rằng đó là một câu hỏi thích hợp –

+1

@ AdelBoutros: Tôi nghĩ rằng bạn đang được khắc nghiệt ở đây, chắc chắn hành vi được ghi trong javadocs, nhưng xem xét số lượng câu hỏi người nghèo được hỏi trong SO, tôi tin rằng Jim đã yêu cầu câu hỏi khá phong nha, với một quirk khá kỳ quặc của một phương pháp. Lỗi duy nhất của anh là không kiểm tra javadocs trước khi yêu cầu ở đây. – posdef

Trả lời

10

Từ docs,

phương pháp này hoạt động như thể bằng cách gọi các phương thức tách hai đối số với biểu thức đã cho và đối số giới hạn bằng 0. Do đó, việc đặt các chuỗi rỗng không được bao gồm trong mảng kết quả.

UPDATE:

Bạn có năm chuỗi con cách nhau bởi ; Trong trường hợp thứ hai, đây là những 1234, x, y, . Theo tài liệu, tất cả các chất nền rỗng (ở cuối) mà kết quả từ hoạt động tách sẽ được loại bỏ. Để biết chi tiết, hãy xem here.

Nếu n là số không sau đó mô hình sẽ được áp dụng nhiều lần như thể, mảng có thể có bất kỳ chiều dài, và dấu chuỗi rỗng sẽ bị loại bỏ.

Chuỗi boo:and:foo, ví dụ, mang lại kết quả như sau với các thông số:

Regex Limit Result 
    :  2  { "boo", "and:foo" } 
    :  5  { "boo", "and", "foo" } 
    :  -2  { "boo", "and", "foo" } 
    o  5  { "b", "", ":and:f", "", "" } 
    o  -2  { "b", "", ":and:f", "", "" } 
    o  0  { "b", "", ":and:f" } // all the empty substrings at the end were eliminated 
+0

+1 cảm ơn. Đã cập nhật OP – Jim

+0

@ruakh Cảm ơn. Tôi không nhận ra điều đó! –

3

Từ http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

phương pháp này hoạt động như thể bằng cách gọi phương pháp phân chia hai đối số với biểu thức đã cho và đối số giới hạn bằng 0. Do đó, việc luồn chuỗi rỗng sẽ không được bao gồm trong mảng kết quả.

+0

Tôi thấy.Nhưng tôi không thể nhận được kết quả chính xác giống như chuỗi đầu tiên, phải không? chiều dài 4 kể từ dấu chấm phẩy cuối cùng thực sự là kết thúc của chuỗi – Jim

4

Cắt bỏ các chuỗi rỗng bị bỏ qua. Nếu bạn cần chúng, hãy sử dụng cách tiếp cận được mô tả trong http://www.xinotes.org/notes/note/226/

+0

Cảm ơn!Cập nhật OP – Jim

+0

Có, phải, bạn muốn ommit chuỗi cuối cùng trống rỗng. Tôi không nghĩ rằng bạn có thể làm điều đó đặc biệt, nhưng bạn luôn có thể tách chỉ tiền tố của chuỗi nếu bạn luôn luôn chắc chắn phần tử cuối cùng là dấu chấm phẩy: 's.substring (0, s.length() - 1) .split (";", -1); ' –

2

Câu hỏi hay. Nếu bạn kiểm tra API documentation cho String.split() và kiểm tra ví dụ bằng "boo: foo" thì bạn có thể thấy rằng các chuỗi trống ở cuối bị bỏ qua.

Phương pháp này hoạt động như thể bằng cách gọi phương thức tách hai đối số với biểu thức đã cho và đối số giới hạn bằng 0. Do đó, việc luồn chuỗi rỗng sẽ không được bao gồm trong mảng kết quả.

Chuỗi "boo: và: foo", ví dụ, mang lại kết quả như sau với các biểu thức:

Regex quả

: { "boo", "và", "foo"}

o { "b", "", ": và: f"}

1

Thats hành vi mặc định của phương pháp tách trong java để không trả về mã thông báo trống. ]

s.split ("\;", -1); phải trả lại mã thông báo rỗng

Các vấn đề liên quan