我有这个代码:
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
。
为什么我最终得到了一个具有第二个元素c1
的ArrayList
labels
?而文件上写着:
测试此令牌生成器的字符串中是否有更多可用的令牌。如果此方法返回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个代币。除非行有空格或空值,否则循环将至少输入一次。