使用hasMoreTokens时计数器b无法按预期每次递增2的技术问询
问题解答:为何for循环中b仅递增1而非预期的2?
嘿,这个问题我太有共鸣了!之前用自定义分词器的时候也踩过类似的坑,咱们来捋清楚为啥会这样~
核心问题出在分词器的hasMoreTokens()方法的状态性上——很多分词器(不管是自定义的还是开源实现)的这个方法并不是纯“查询”用的:有些实现里,调用hasMoreTokens()会提前扫描下一个token,甚至直接把内部的位置指针往前挪一步;而更关键的是,hasMoreTokens()和nextToken()是强绑定的,每次调用nextToken()都会消耗一个token,让指针前进到下一个位置。
结合你的场景来看,你保留最后一个for循环的时候,那个内部循环肯定也在调用hasMoreTokens()或者nextToken()对吧?比如可能是这样的结构:
int b = 0; // 复制自分词器源码的外部循环 while (tokenizer.hasMoreTokens()) { // 你的处理逻辑 b += 2; // 期望每次加2 // 你添加的最后一个for循环 for (; tokenizer.hasMoreTokens(); ) { // 这里调用了tokenizer.nextToken()或者再次调用hasMoreTokens() String token = tokenizer.nextToken(); // 甚至可能在这里不小心修改了b? } }
这种情况下,外部循环刚进入,你给b加了2,然后内部循环直接消耗了下一个token(或者让分词器指针前进了),导致下一次外部循环的hasMoreTokens()直接返回false,循环提前结束。结果就是你以为会循环N次每次加2,实际只循环了N/2次,总增量看起来就像是每次只加1。
而当你移除那个内部for循环后,外部循环可以正常按分词器的token数量迭代,每次处理一个(或者一对)token,b每次加2就符合你的预期了。
总结一下:分词器是有状态的,不要在嵌套循环里同时调用它的hasMoreTokens()和nextToken(),否则会打乱它的内部指针,导致循环迭代次数和你预期的不一致~
内容的提问来源于stack exchange,提问作者duroy
相关产品推荐
相关产品推荐

