为什么 StringTokenizer.hasMoreTokens 在不应该返回 true 时返回 true?



我有这个代码:

StringTokenizer st = new StringTokenizer (line, String.valueOf(delimiter));
labels.add("Time");
int currentCol = 1;                                                 
while (st.hasMoreTokens())
{
st.nextToken();
labels.add(new String("c" + currentCol++));                                
}

其中,delimiter;,线是0.6245

为什么我最终得到了一个具有第二个元素c1ArrayListlabels?而文件上写着:

测试此令牌生成器的字符串中是否有更多可用的令牌。如果此方法返回true,那么对nextToken的后续调用(不带参数)将成功返回一个令牌。

退货:

true当且仅当当前位置之后的字符串中至少有一个令牌false否则。

既然值:0.6245不能被分隔符;分割,为什么hasMoreTokens()会返回true

编辑:

现在我明白了为什么while循环get至少执行一次。因为StringTokenizer就是这样工作的。这里访问元素的唯一方法是使用nextElement()方法,而不是我习惯的可以访问结果array的任何位置的常规split。这意味着即使StringTokenizer中只有一个元素,它也将始终从hasMoreTokens()返回true

我之所以想知道StringTokenizer,这是我从遗留类中学到的东西,是因为我正在审查一个即将重用的旧代码。

您的问题是因为您在循环之外的列表中添加了一个元素:

labels.add("Time");

在Tokenize工作后,您只有一个令牌。这是因为当你标记一个没有通知分隔符的字符串时,你只有一个元素,所以如果你的字符串是0.6245,就把它理解为(你的分隔符):

First token: 0.6245
Second token: nothing

这就像是:0.6245;

在你的循环中,你正在向你的数组列表中添加另一件事:

labels.add(new String("c" + currentCol++));

由于您将currentCol初始化为1,并且while将只运行一次,因此它将在列表的第二个元素上具有c1作为值(记住,您之前已经添加了一个)

我不知道你想达到什么目的。但你似乎想要这样的东西:

StringTokenizer st = new StringTokenizer (line, String.valueOf(delimiter));
//Don't add this:
//labels.add("Time");
int currentCol = 1;                                                 
while (st.hasMoreTokens())
{
String someThing = st.nextToken();
labels.add(new String("Current token:" + someThing 
+ "n currentCol: " + currentCol++));                                
}

0.6245本身就是一个标记,尽管您没有分隔符。如果你有这样的东西"0.6245;0.987">,那么它有2个代币。除非有空格或空值,否则循环将至少输入一次。

相关内容

  • 没有找到相关文章

最新更新