Java 如何使用令牌迭代器组合数字

Java 如何使用令牌迭代器组合数字,java,iterator,expression,token,Java,Iterator,Expression,Token,我有一段代码,它读取表达式的每个标记。输出应该是这样的。我怎样才能把这些数字放在一起 下一个标记:[15] 下一个令牌:[*] 下一个令牌:[(] 下一个令牌:[26] 等等 但是我得到了这个 下一个标记:[1] 下一个标记:[5] 下一个令牌:[*] 下一个令牌:[(] 下一个标记:[2] 下一个标记:[6] import java.util.Iterator; import java.util.Scanner; public class TokenIter implements Iter

我有一段代码,它读取表达式的每个标记。输出应该是这样的。我怎样才能把这些数字放在一起

下一个标记:[15]

下一个令牌:[*]

下一个令牌:[(]

下一个令牌:[26]
等等

但是我得到了这个

下一个标记:[1]

下一个标记:[5]

下一个令牌:[*]

下一个令牌:[(]

下一个标记:[2]

下一个标记:[6]

import java.util.Iterator;
import java.util.Scanner;


public class TokenIter implements Iterator<String>{

// This class builds a Token Iterator, that produces 
// Strings containing numbers (sequences of digits) and 
// special characters: "(" ")" "+" "-"  "*" "/"

//input line to be tokenized
private String line;

// the next Token, null if no next Token
private String nextToken;

public TokenIter(String line){
    this.line = line;
}
static int counter = 0;

public void remove() {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException();
}


public static void main(String[] args){
    String line = "  15*(26+37) - 432/5*61 - (321-1234567)   ";
    System.out.println("line: [" + line + "]");
    TokenIter tokIt = new TokenIter(line);
    // print tokens in square brackets to check absence of white space
    while(tokIt.hasNext()){
        if (tokIt.next() != "no")
            System.out.println("next token: [" + tokIt.next() + "]");

        else
        {

        }
        counter++;

    }   
}
public boolean hasNext(){ 
    if (counter < line.length())
    {
        return true;
    }
    else 
    {
        return false;
    }
}

//char c;

public String next() {
    //String L = line.trim();
    String s = "";
    //  for (int index =0; index < L.length(); index++){
    if (!hasNext())
        return null;
    else{
        {
            char c = line.charAt(counter);
            if( c == ('/'))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            if( c == ('+'))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            if( c == ('*'))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            if( c == ('-'))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            if( c == ('('))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            if( c == (')'))
            {
                counter = counter++;
                s = "" + c;
                return s;
            }
            else if (c == ' ')
            {
                counter = counter++;
                return "no";
            }

            else if (c == ('0'|'1'| '2' | '3'|'4'|'5'| '6'| '7' |'8' | '9'))
            {
                counter = counter++;
                return s;
            }
            else if (Character.isDigit(c)){
                if((c == '0') || (c == '1') ||(c == '2') ||(c == '3') ||(c == '4') ||(c == '5') ||(c == '6') ||(c == '7') ||(c == '8') || (c == '9'))
                    counter = counter++;
                s += "" + c;
                return s;
            }
        }
    }
    return s;
}}
import java.util.Iterator;
导入java.util.Scanner;
公共类TokenIter实现迭代器{
//此类构建一个令牌迭代器,该迭代器生成
//包含数字(数字序列)和
//特殊字符:(“”)“”+“”-“”*“”/“”
//要标记化的输入行
专用字符串线;
//下一个令牌,如果没有下一个令牌,则为null
私有字符串nextToken;
公共令牌(字符串行){
this.line=line;
}
静态整数计数器=0;
公共空间删除(){
//TODO自动生成的方法存根
抛出新的UnsupportedOperationException();
}
公共静态void main(字符串[]args){
字符串行=“15*(26+37)-432/5*61-(321-1234567)”;
System.out.println(“行:[“+行+”]);
TokenIter tokIt=新的TokenIter(线);
//在方括号中打印代币以检查是否存在空白
while(tokIt.hasNext()){
if(tokIt.next()!=“否”)
System.out.println(“下一个令牌:[“+tokIt.next()+”]);
其他的
{
}
计数器++;
}   
}
公共布尔值hasNext(){
if(计数器
似乎您正在尝试构建数学表达式反编译程序。有多种方法可以实现此目的。一种方法是使用字符串标记器并设置分隔符:

公共字符串nextToken(字符串delim)


但是,不再接受使用字符串标记器类。建议使用split方法。

这可以通过一些正则表达式魔法轻松完成。其思想是您希望拆分字符串,但同时保留分隔符。这可以通过向前看或向后看来完成,但分隔符最终会附着在一边或另一边。To修复您需要同时使用两者的问题。这将导致分隔符作为单独的标记返回

// Define the characters to split on: ' ', '+', '-', '*', '\', '(', ')'
final String splitOn = "\\+|-|\\*|/|\\(|\\)";
final String lookAheadGroup = "(?=" + splitOn + ")";
final String lookBehindGroup = "(?<=" + splitOn + ")";
final String regex = "(" + lookBehindGroup + "|" + lookAheadGroup + ")";
或者用扫描仪

System.out.println("\n\nScanner");
Scanner scanner = new Scanner(line);
scanner.useDelimiter(regex);

while(scanner.hasNext()) {
    System.out.printf("'%s'\n", scanner.next());
}
scanner.close();
示例输出

请注意,令牌没有额外的空白区域,因此,如果后期处理对其敏感,则必须这样做

'15', '*', '(', '26', '+', '37', ')', ' ', '-', ' 432', '/', '5', '*', '61 ', '-', ' ', '(', '321', '-', '1234567', ')', 

你需要一个
while
循环来累加相邻的数字。很难看到最后一个
块的点,否则如果
块和上一个块,它就不会像你想象的那样了。@EJP我试着做了一个while循环,但我仍然得到相同的结果。我需要添加什么?
'15', '*', '(', '26', '+', '37', ')', ' ', '-', ' 432', '/', '5', '*', '61 ', '-', ' ', '(', '321', '-', '1234567', ')',