繁体   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