java - 迭代器实现只读取字符串中的第一个标记?

标签 java iterator token

对于这个程序,我需要实现一个 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/

相关文章:

Java 泛型 : Why compiler can not resolve type T to inherited type in method?

java - 如何在 Spring MVC 中更改 BindingResult 中的异常消息

c++ - 使用 boost transform_iterator 有条件地进行 std::transform

java - 如何在 Activity 之间传递 Seek Bar 变量?

java - 如何在 android studio 3.1.1 中引入默认的 pdf 打开选项

c++ - 我可以只从迭代器访问结尾吗?

rust - 为什么借用的范围不是迭代器,但范围是?

ios - 如何在 Swift 中使用 AgoraRtcEngineKit 创建 channel 和服务器 token ?

java - 在代码中生成新的 OAuthAccessToken 和 OAuthAccessTokenSecret

flutter - 使用代币和云功能实现 FCM 的最佳方法