我正在使用令牌迭代器(有效令牌,&#34;真,假,&#34;真&#34;,&#34;&amp;&#34;,&#34;!&#34; ,&#34;(&#34;,&#34; false&#34;,&#34; ^&#34;,&#34; true&#34;,&#34;)&#34;。< / p>
代码正常,我的问题是关于返回值。我经常遇到这个问题,我有return语句,但是最后的return语句通过复制最后一个return语句抛出了我的结果。
我想我肯定知道这个错误存在于{和}的位置内,虽然我已经知道它们是不必要的,因为有很多嵌套的感觉如果有这样的感觉他们是必要的。
对我和其他合作伙伴来说,这似乎是一个常见的问题,有没有人知道如何防止这个问题的发生?谢谢!
我的代码输出:
行:[! BAD(true ^ false)%truelybad] 下一个标记:[!]
下一个标记:[(]
下一个标记:[true]
下一个标记:[^]
下一个标记:[false]
下一个标记:[)]
下一个标记:[)]
并应输出
下一个标记:[!]
下一个标记:[(]
下一个标记:[true]
下一个标记:[^]
下一个标记:[false]
下一个标记:[)]
<!--LIBRARIES USED BY BOOTSNIP:-->
<script src="https://netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!--REQUIRED LIBRARY USED BY BOOTSNIP:-->
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css" rel="stylesheet"/>
<div class="form-group">
<div class="icon-addon addon-lg">
<input type="text" placeholder="Email" class="form-control" id="email"><label for="email" class="glyphicon glyphicon-search" rel="tooltip" title="email"></label>
</div>
<!--HERE:-->
<!--HERE:-->
<div align="left">
<label class="help-block glyphicon glyphicon-info-sign">*<span style="font-family:Arial"> This is a Required Field (align="left")</span></label>
</div>
<!--HERE:-->
<!--HERE:-->
<div class="icon-addon addon-lg">
<input type="text" placeholder="Email" class="form-control" id="email"><label for="email" class="glyphicon glyphicon-search" rel="tooltip" title="email"></label>
</div>
<!--HERE:-->
<!--HERE:-->
<div align="center">
<label class="help-block glyphicon glyphicon-info-sign">*<span style="font-family:Arial"> This is a Required Field (align="center")</span></label>
</div>
<!--HERE:-->
<!--HERE:-->
<div class="icon-addon addon-lg">
<input type="text" placeholder="Email" class="form-control" id="email">
<!--NOT HERE:-->
<!--NOT HERE:-->
<!--NOT HERE:-->
<label for="email" class="glyphicon glyphicon-search" rel="tooltip" title="email"></label>
</div>
<!--HERE:-->
<!--HERE:-->
<div align="right">
<label class="help-block glyphicon glyphicon-info-sign">*<span style="font-family:Arial"> This is a Required Field (align="right")</span></label>
</div>
<!--HERE:-->
<!--HERE:-->
</div>
}
答案 0 :(得分:0)
这里的根本问题是你的hasNext()
方法返回true,如果字符串中有另一个标记,但是它还没有完成解析字符串。
所以如果你输入字符串" ! ! true lotsofcrap "
会发生什么,然后调用next()
将返回"!"
,然后"!"
,然后"true"
,然后返回已返回的字符串中没有更多标记,但hasNext()
仍然返回true。
你可能会考虑做的是让hasNext()
解析字符串,但不是返回下一个String,只有当它在当前位置之前找到另一个标记时才返回true。请注意,在hasNext()
中,您不希望直接递增count
。相反,在int something = count;
的开头创建一个局部变量hasNext()
并使用它。如果你解决了这个问题,那么代码的其余部分应该就可以了。
答案 1 :(得分:0)
只有当最后一位数字不是令牌时才会出现问题。 原因 - 你正在检查hasNext(),这是真的,它进入你的代码。你没有为这种情况设置nextToken所以它使用你的lask令牌并显示它。 我更新了你的代码,总是返回一个值并检查值返回是否来自令牌列表然后显示否则忽略它。
public class test implements Iterator<String> {
static List<String> tokenList = Arrays.asList( "true", "&", "!", "(", "false", "^", "true", ")");
ArrayList<String> token = new ArrayList<String>();
static int count = 0;
// input line to be tokenized
private String line;
// the next Token, null if no next Token
private String nextToken;
// implement
public test(String line) {
this.line = line;
}
@Override
// implement
public boolean hasNext() {
// System.out.println(count);
return count < line.length();
}
@Override
// implement
public String next() {
while (hasNext()) {
char c = line.charAt(count);
if (c == '!' || c == '!' || c == '^' || c == '(' || c == ')') {
token.add(Character.toString(c));
count++;
nextToken = Character.toString(c);
return nextToken;
} else if (c == 't' || c == 'T') {
count++;
c = line.charAt(count);
if (c == 'r') {
count++;
c = line.charAt(count);
}
if (c == 'u') {
count++;
c = line.charAt(count);
}
if (c == 'e') {
count++;
c = line.charAt(count);
}if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
token.add("true");
nextToken = "true";
//count++;
return nextToken;
}
} else if (c == 'f' || c == 'F') {
count++;
c = line.charAt(count);
if (c == 'a') {
count++;
c = line.charAt(count);
}
if (c == 'l') {
count++;
c = line.charAt(count);
}
if (c == 's') {
count++;
c = line.charAt(count);
}
if (c == 'e') {
count++;
c = line.charAt(count);
}
if (c == ' ' || c == '!' || c == '!' || c == '^' || c == '(' || c == ')'){
token.add("false");
nextToken = "false";
// count++;
return nextToken;
}
} else if (c == ' ') {
count++;
nextToken = null;
} else {
count++;
nextToken = null;
}
}
return nextToken;
}
@Override
// provided, do not change
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
// provided
public static void main(String[] args) {
String line;
// you can play with other inputs on the command line
if (args.length > 0)
line = args[0];
// or do the standard test
else
line = " ! BAD (true ^ false) % truelybad ";
System.out.println("line: [" + line + "]");
test tokIt = new test(line);
while (tokIt.hasNext()) {
String s = tokIt.next();
if (s != null && tokenList.contains(s))
System.out.println("next token: [" + s + "]");
}
}
}