Tôi có một vấn đề dường như đơn giản của việc tách một dấu phẩy tách String
vào thẻ, trong đó sản lượng nên bao gồm thẻ trống trong các trường hợp:Tokenising một String chứa thẻ trống
- Ký tự đầu tiên trong
String
là một dấu phẩy . - Ký tự cuối cùng trong
String
là dấu phẩy. - Hai dấu phẩy liên tiếp xảy ra.
Ví dụ: đối với String
: ",abd,def,,ghi,"
sẽ cho kết quả đầu ra: {"", "abd", "def", "", "ghi", ""}
.
Tôi đã thử sử dụng String.split
, Scanner
và StringTokenizer
cho điều này nhưng mỗi cung cấp một đầu ra không mong muốn khác nhau (ví dụ bên dưới). Bất cứ ai có thể đề xuất một giải pháp thanh lịch cho điều này, tốt hơn là sử dụng các lớp JDK? Rõ ràng tôi có thể viết một cái gì đó bản thân mình nhưng tôi cảm thấy như tôi đang thiếu một cái gì đó trên một trong ba cách tiếp cận được đề cập. Lưu ý rằng dấu phân cách là một String
cố định mặc dù không nhất thiết là dấu phẩy, cũng không phải là ký tự đơn.
Ví dụ Mã
import java.util.*;
public class Main12 {
public static void main(String[] args) {
String s = ",abd,def,,ghi,";
String[] tokens = s.split(",");
System.err.println("--- String.split Output ---");
System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens)));
for (int i=0; i<tokens.length; ++i) {
System.err.println(String.format("tokens[%d] = %s", i, tokens[i]));
}
System.err.println("--- Scanner Output ---");
Scanner sc = new Scanner(s);
sc.useDelimiter(",");
while (sc.hasNext()) {
System.err.println(sc.next());
}
System.err.println("--- StringTokenizer Output ---");
StringTokenizer tok = new StringTokenizer(s, ",");
while (tok.hasMoreTokens()) {
System.err.println(tok.nextToken());
}
}
}
Output
$ java Main12
--- String.split Output ---
,abd,def,,ghi, -> [, abd, def, , ghi]
tokens[0] =
tokens[1] = abd
tokens[2] = def
tokens[3] =
tokens[4] = ghi
--- Scanner Output ---
abd
def
ghi
--- StringTokenizer Output ---
abd
def
ghi