簡體   English   中英

StringTokenizer顯示不需要的結果

[英]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個定界符(字符DELIM )。

您可以使用以下代碼查看效果

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不是定界符,而是其中的所有字符都是定界符(即DELIM )。

當您運行以下代碼時:

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

如您所見,您的輸入在DM (輸入中存在)上分開了。

如文檔所述,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM