对于这个程序,我需要实现一个 token 迭代器,它从一个字符串中扫描并存储一个有效的 token 。这似乎是一个简单的过程,但我的代码只返回字符串中的第一个有效标记。我需要调用 hasNext(); 吗?在 next() 方法的不同位置?
这是我的代码:
public class TokenIter implements Iterator<String>{
//input line to be tokenized
private String line;
// the next Token, null if no next Token
private String nextToken;
//Edit
private Scanner scan;
public TokenIter(String line){
this.line = line;
}
@Override
public boolean hasNext() {
//Edit
scan = new Scanner(line);
if(scan.hasNext()){
nextToken = scan.next();
return true;
}
scan.next();
nextToken = null;
return false;
}
@Override
public String next() {
if(!hasNext()){
throw new NoSuchElementException();
}
else{
if(nextToken.equals("true")){
return nextToken;
}
if(nextToken.equals("false")){
return nextToken;
}
if(nextToken.equals("or")){
return nextToken;
}
if(nextToken.equals("and")){
return nextToken;
}
if(nextToken.equals("not")){
return nextToken;
}
if(nextToken.equals("(")){
return nextToken;
}
if(nextToken.equals(")")){
return nextToken;
}
}
return "";
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
public static void main(String[] args){
String line;
args = Debug.init(args);
if(args.length>0)
line = args[0];
else
line = " not (true or error false) @# $% ";
System.out.println("line: [" + line + "]");
TokenIter tokIt = new TokenIter(line);
while(tokIt.hasNext()){
System.out.println("next token: [" + tokIt.next() + "]");
}
}
这是我运行程序的输出:
line: [ not (true or error false) @# $% ]
next token: [not]
next token: [not]
next token: [not]
next token: [not]
next token: [not]
next token: [not]
这是我想要的输出:
line: [ not (true or error false) @# $% ]
next token: [not]
next token: [(]
next token: [true]
next token: [or]
next token: [false]
next token: [)]
最佳答案
您的hasNext()
方法不正确,您在每次调用时扫描行
,因此您将始终返回第一个标记:
@Override
public boolean hasNext() {
Scanner scan = new Scanner(line);
if(scan.hasNext()){
nextToken = scan.next();
return true;
}
scan.next();
nextToken = null;
return false;
解决方法:
变量 scan
需要成为一个类变量,以便您保持 hasNext()
调用之间的状态。
关于java - 迭代器实现只读取字符串中的第一个标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42360158/