StringTokenizer显示不需要的结果

时间:2018-06-19 06:54:08

标签: java string stringtokenizer

当我运行以下代码时,我发现了一些奇怪的东西。

以下程序的输出为 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();
    }

}

有人可以解释我如何解决这个问题以及它为什么会这样?

6 个答案:

答案 0 :(得分:2)

摘自constructor's documentation

  

delim参数中的字符是分隔标记的分隔符。

这意味着每个字符是一个分隔符,而不是整个字符串。实际上,您有5个分隔符(字符DELIM)。

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

while (tokenizer.hasMoreTokens())
   System.out.println(tokenizer.nextToken());

打印出来:

AAAAA
BBBBB|
U
Y

答案 1 :(得分:1)

没有你的分隔符是D E L I和M

请参阅javadocs delim参数中的所有字符都是用于分隔标记的分隔符。

delim - 分隔符。

考虑

{{1}}

答案 2 :(得分:1)

StringTokenizer带一个字符串,其中每个字符都是分隔符。由于D是您的分隔符之一,因此|之后会删除第二个令牌。

如果要使用多字符分隔符,则必须使用其他技术。例如,split

String[] parts = Arrays.toString(input.split(delim)); 

答案 3 :(得分:1)

实现此功能有多种选择。为了开始它为什么会发生,我认为很好地解释了各种帖子,因为你的分隔符不是“DELIM”,而是“D”,“E”,“L”,“I”,“M “

现在,如果你想根据另一个字符串(如DELIM

)分隔字符串,你可以使用什么

选项1:使用字符串拆分方法,它将分隔符字符串作为参数并返回标记数组

String statement = "AAAADELIMBBBB|DUMMY";
String tokens[] = statement.split("DELIM");

选项2:使用splitAsStream,它将语句作为参数并编译,将regex分隔符作为参数

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的忠实粉丝并且想要仅使用它来实现它,你也可以使用带有“D”的字符串标记符作为分隔符,然后对于每个接收到的标记,可以检查前四个字符是“ELIM”。如果是,则将remaninng子字符串作为标记并与进一步接收标记连接,如果不在开始时附加D,则使用当前标记附加。

答案 4 :(得分:0)

来自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

正如您所看到的那样,您的输入在D& M(出现在您的输入中)。

答案 5 :(得分:0)

正如文档所解释的那样,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 String[] tokens = input.split("DELIM");
    for (String token:tokens) {
        System.out.println(token);
    }

}