Java 如何丢弃不需要的代币
我创建了这个令牌迭代器类,它按每个字符扫描输入行,并创建Java 如何丢弃不需要的代币,java,loops,iterator,token,Java,Loops,Iterator,Token,我创建了这个令牌迭代器类,它按每个字符扫描输入行,并创建Strings。我可以让类读取所有标记并将它们分开,但我无法让它删除输入中所有无效/不需要的标记 我试着用character.toString(counter)做一些事情,这样这些字符就变成了一个字符串,然后写if语句,当标记不是“not”、“true”、“false”或“and”时,就放弃它,继续下一个标记 import java.util.Iterator; public class Tokiter implements Iterat
String
s。我可以让类读取所有标记并将它们分开,但我无法让它删除输入中所有无效/不需要的标记
我试着用character.toString(counter)
做一些事情,这样这些字符就变成了一个字符串,然后写if语句,当标记不是“not”、“true”、“false”或“and”时,就放弃它,继续下一个标记
import java.util.Iterator;
public class Tokiter implements Iterator<String>{
private char counter = 0;
//input line to be tokenized
private String line;
// the next Token, null if no next Token
private String nextToken;
// implement
public TokIter(String line){
this.line = line;
}
@Override
// implement
public boolean hasNext() {
if (counter >= line.length())
return false;
else if (line.charAt(counter) == ' ')
{
counter++;
return hasNext();
}
else
return true;
}
@Override
//implement
public String next() {
String s = "";
if (!hasNext())
{
// System.out.println("Null");
return null;
}
else if( line.charAt(counter) == ('('))
{
// System.out.println("Token");
s += line.charAt(counter);
counter++;
return s;
}
else if( line.charAt(counter) == (')'))
{
// System.out.println("Token");
s += line.charAt(counter);
counter++;
return s;
}
else
s += line.charAt(counter);
counter++;
if (counter >= line.length()){
return s;
}
while (Character.isLetter(line.charAt(counter)))
{
s += line.charAt(counter);
counter++;
if (counter >= line.length()){
return s;
}
}
return s;
}
@Override
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 = " not random (true or false) ** whatever ";
System.out.println("line: [" + line + "]");
Tokiter tokIt = new Tokiter(line);
while(tokIt.hasNext()){
System.out.println("next token: [" + tokIt.next() + "]");
}
}
}
你有什么错误吗?或者你认为你只是有逻辑错误?你知道这个类可以被一行代码所取代吗?请注意,如果您要删除不“正确”的标记,您的
hasNext()
现在的状态将违反迭代器
契约,因为它将为该**
返回true
,而您不会返回它。此外,从<代码> NEXT()/<代码>中返回<代码> null <代码>也是对合同的违反——您应该抛出<代码> NouChelEngultExabuty/Cuth>。目前,您的类有两个职责:标记化输入和迭代这些标记。您可能会发现,通过将这两件事分成两个类,实现起来更容易(如果您将令牌存储在现有的Java集合类中,您甚至不需要自己实现Iterator
)。有人提到my hasNext()将违反迭代器契约。在我的hasNext()中,我做了一个例子,如果它是一个空格,那么跳过它,继续下一个标记,因此我必须添加一个例子,如果它是一个无效的标记。做同样的事情,然后转到下一个令牌?是否有任何错误?或者你认为你只是有逻辑错误?你知道这个类可以被一行代码所取代吗?请注意,如果您要删除不“正确”的标记,您的hasNext()
现在的状态将违反迭代器
契约,因为它将为该**
返回true
,而您不会返回它。此外,从<代码> NEXT()/<代码>中返回<代码> null <代码>也是对合同的违反——您应该抛出<代码> NouChelEngultExabuty/Cuth>。目前,您的类有两个职责:标记化输入和迭代这些标记。您可能会发现,通过将这两件事分成两个类,实现起来更容易(如果您将令牌存储在现有的Java集合类中,您甚至不需要自己实现Iterator
)。有人提到my hasNext()将违反迭代器契约。在我的hasNext()中,我做了一个例子,如果它是一个空格,那么跳过它,继续下一个标记,因此我必须添加一个例子,如果它是一个无效的标记。做同样的事情,然后转到下一个令牌?