当我运行以下代码时,我发现了一些奇怪的东西。
以下程序的输出为 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();
}
}
有人可以解释我如何解决这个问题以及它为什么会这样?
答案 0 :(得分:2)
摘自constructor's documentation:
delim参数中的字符是分隔标记的分隔符。
这意味着每个字符是一个分隔符,而不是整个字符串。实际上,您有5个分隔符(字符D
,E
,L
,I
和M
)。
您可以使用以下代码查看效果
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
不是分隔符,但其中的所有字符都是分隔符(即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
(出现在您的输入中)。
答案 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);
}
}