【问题标题】:StringTokenizer showing unwanted resultsStringTokenizer 显示不需要的结果
【发布时间】:2018-06-19 06:54:08
【问题描述】:

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

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

}

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

【问题讨论】:

  • @Berger 但是,我的分隔符是 Delim
  • @ScaryWombat--你能告诉我怎么做吗?因为我把字符串作为分隔符
  • 在下面查看我的答案
  • 需要考虑的事情(来自 StringTokenizer api)“StringTokenizer 是一个遗留类,出于兼容性原因保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人使用String 或 java.util.regex 包的 split 方法。"
  • @ShowStopper 当一个选项被贬低时,JAVA 提供了各种其他选项。请在stackoverflow.com/a/50922619/1262248 提供其他三种标记化方式

标签: java string stringtokenizer


【解决方案1】:

摘自constructor's documentation

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

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

可以用下面的代码看到效果

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

打印出来的:

AAAAA
BBBBB|
U
Y

【讨论】:

    【解决方案2】:

    没有你的分隔符是 D E L I 和 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();
    

    【讨论】:

      【解决方案3】:

      StringTokenizer 接受一个字符串,其中每个字符都是一个分隔符。由于D 是您的分隔符之一,第二个标记在| 之后被切断。

      如果您想使用多字符分隔符,则必须使用不同的技术。例如,split

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

      【讨论】:

        【解决方案4】:

        有多个选项可以实现此功能。首先,为什么会发生这种情况,我认为各种帖子都很好地解释了这是因为您的分隔符不是“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 的铁杆粉丝并且只想使用它来实现它,您还可以使用带有“D”作为分隔符的 String Tokenizer,然后对于收到的每个令牌,可以检查前四个字符是否为“ELIM”。如果是,则将剩余的子字符串作为令牌并与进一步的接收令牌连接,如果不是,则在开始时附加 D,然后附加当前令牌。

        【讨论】:

          【解决方案5】:

          来自 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 (在您的输入中存在)进行了拆分。

          【讨论】:

            【解决方案6】:

            正如文档所解释的,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);
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多