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

时间:2016-05-28 23:13:08

标签: java stringtokenizer

我有这段代码:

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

为什么我最终会得到ArrayList labels第二个元素c1?虽然文档说:

  

测试此tokenizer的字符串中是否有更多可用的标记。如果此方法返回true,则后续调用nextToken且不带参数将成功返回一个标记。

     

返回:

     

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

由于价值0.6245无法按分隔符;拆分,为什么hasMoreTokens()会返回true

修改

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

我想知道StringTokenizer我学习遗留类的原因是我正在审查一些我将要重用的旧代码。

2 个答案:

答案 0 :(得分:2)

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

UIViewController

Tokenize工作后只有一个令牌。那是因为当你对没有通知分隔符的String进行标记时,你只有一个元素,所以如果你的字符串是labels.add("Time"); ,那么将它理解为令牌(对于你的分隔符):

0.6245

就好像是:First token: 0.6245 Second token: nothing

在你的循环中,你要在数组列表中添加另一个东西:

0.6245;

由于您将labels.add(new String("c" + currentCol++)); 初始化为currentCol,而1只会运行一次,因此会在列表的第二个元素上显示while值(请记住,您之前添加了一个)

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

c1

答案 1 :(得分:2)

虽然您没有分隔符,但

0.6245 本身就是一个标记。 如果您有这样的“0.6245; 0.987”,那么它有2个令牌。除非您的有空格或空值,否则循环将至少输入一次。