Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何丢弃不需要的代币_Java_Loops_Iterator_Token - Fatal编程技术网

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()中,我做了一个例子,如果它是一个空格,那么跳过它,继续下一个标记,因此我必须添加一个例子,如果它是一个无效的标记。做同样的事情,然后转到下一个令牌?