[英]StringTokenizer showing unwanted results
當我運行以下代碼時,我發現了一些奇怪的東西。
下面程序的輸出是token1 = AAAAA token2 = BBBBB |
但是,據我了解,應該是token1 = AAAAA token2 = BBBBB | DUMMY
public class TestToken {
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
final String text1 = tokenizer.nextToken();
final String text2 = tokenizer.nextToken();
System.out.println("token1=" + text1);
System.out.println("token2=" + text2);
System.out.println();
}
}
有人可以向我解釋如何解決此問題,以及為什么會這樣嗎?
摘錄自構造函數的文檔 :
delim參數中的字符是用於分隔標記的定界符。
這意味着每個字符都是一個定界符,而不是整個字符串。 實際上,您有5個定界符(字符D
, E
, L
, I
和M
)。
您可以使用以下代碼查看效果
while (tokenizer.hasMoreTokens())
System.out.println(tokenizer.nextToken());
輸出:
AAAAA
BBBBB|
U
Y
沒有分隔符是DELI和M
請參見javadocs。delim 參數中的所有字符都是用於分隔標記的定界符。
delim-分隔符。
考慮
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|ZUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
final String text1 = tokenizer.nextToken();
final String text2 = tokenizer.nextToken();
System.out.println("token1=" + text1);
System.out.println("token2=" + text2);
System.out.println();
StringTokenizer
接受一個字符串,其中每個字符都是一個定界符 。 由於D
是您的定界符之一,因此第二個標記在|
之后被截斷|
。
如果要使用多字符定界符,則必須使用其他技術。 例如, split
:
String[] parts = Arrays.toString(input.split(delim));
有多個選項可以實現此功能。 首先,為什么會發生這種情況,我認為各種帖子都很好地解釋了這是因為您的定界符不是“ DELIM”,而是“ D”,“ E”,“ L”,“ I”,“ M” “
現在,如果要基於另一個字符串(如DELIM)分隔字符串,可以使用什么
選項1:使用字符串拆分方法,該方法將以分隔符字符串作為參數並返回令牌數組
String statement = "AAAADELIMBBBB|DUMMY";
String tokens[] = statement.split("DELIM");
選項2:使用splitAsStream(它將語句作為參數並進行編譯)將正則表達式定界符作為參數
Pattern.compile("DELIM").splitAsStream("AAAADELIMBBBB|DUMMY").forEach(System.out::println);
選項3 :將Stream.of與split作為爭論
Stream.of("AAAADELIMBBBB|DUMMY".split("DELIM")).forEach(System.out::println);
除了上述超級酷的拆分方法外,如果您是String Tokenizer的忠實粉絲,並且只想使用該方法來實現它,則還可以使用String Tokenizer並以“ D”作為分隔符,然后針對收到的每個令牌進行檢查前四個字符為“ ELIM”。 如果是,則將remaninng子字符串作為令牌,並與其他接收令牌連接;如果不是,則在開始處附加D,然后在當前令牌后附加。
來自StringTokenizer的文檔
為指定的字符串構造一個字符串標記器。 delim參數中的字符是用於分隔標記的定界符。 分隔符本身不會被視為標記。
這意味着DELIM
不是定界符,而是其中的所有字符都是定界符(即D
, E
, L
, I
和M
)。
當您運行以下代碼時:
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final StringTokenizer tokenizer = new StringTokenizer(input, delim);
while(tokenizer.hasMoreElements()){
System.out.println("token =" + tokenizer.nextToken());
}
}
它給出以下輸出:
token =AAAAA
token =BBBBB|
token =U
token =Y
如您所見,您的輸入在D
& M
(輸入中存在)上分開了。
如文檔所述,delim參數中的所有字符都是用於分隔標記的定界符。
您需要做的是使用split函數。
public static void main(final String[] args) {
final String delim = "DELIM";
String token1 = "AAAAA";
String token2 = "BBBBB|DUMMY";
final String input = token1 + delim + token2;
final String[] tokens = input.split("DELIM");
for (String token:tokens) {
System.out.println(token);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.