我有这段代码:
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
我学习遗留类的原因是我正在审查一些我将要重用的旧代码。
答案 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个令牌。除非您的行有空格或空值,否则循环将至少输入一次。