Java 从表达式中分离变量/数组,并删除重复项?

Java 从表达式中分离变量/数组,并删除重复项?,java,expression,tokenize,Java,Expression,Tokenize,我从表达式中分离出变量和数组名,然后尝试删除重复项。我的代码适用于大多数表达式,但当出现诸如(a+a[a*2-b])之类的表达式时,我会遇到麻烦,因为我的程序将两个a识别为单独的变量,因为第一个a后面有空格。我觉得有一个简单的解决办法,但我想不出来。有什么想法吗 public void buildSymbols() { String s = expr; //input from a different part of the program scalars = new

我从表达式中分离出变量和数组名,然后尝试删除重复项。我的代码适用于大多数表达式,但当出现诸如
(a+a[a*2-b])
之类的表达式时,我会遇到麻烦,因为我的程序将两个
a
识别为单独的变量,因为第一个
a
后面有空格。我觉得有一个简单的解决办法,但我想不出来。有什么想法吗

    public void buildSymbols() {

    String s = expr; //input from a different part of the program 
    scalars = new ArrayList<ScalarSymbol>(5);
    arrays = new ArrayList<ArraySymbol>(5); 

    for(int i = 0; i<s.length(); i++){
        if(Character.isLetter(s.charAt(i))){
            String temp = ""; // empty string to add on to

            while(i<s.length() && s.charAt(i)!= '*' && s.charAt(i)!= '/' && s.charAt(i)!= '[' && s.charAt(i)!= ']' && s.charAt(i)!= '+' && s.charAt(i)!= '-' && s.charAt(i)!= '(' && s.charAt(i)!= ')'){ // will form variables until delimiter is found (*/[]())
                temp = temp + s.charAt(i);
                i++;
            }
            if(i<s.length() && s.charAt(i) == '['){ //array 
                ArraySymbol addArr = new ArraySymbol(temp);
                    if(arrays.contains(addArr)){ // duplicate 
                        break;
                    }
                arrays.add(addArr);
            } else{ //variable 
                ScalarSymbol addSca = new ScalarSymbol(temp);
                if(scalars.contains(addSca)){ // duplicate 
                    break;
                }
                scalars.add(addSca);
            }
        }
    }
    System.out.println(arrays);
    System.out.println(scalars);
}
public void buildSymbols(){
字符串s=expr;//来自程序不同部分的输入
标量=新数组列表(5);
数组=新的数组列表(5);

对于(inti=0;i,您的问题是您有两个变量:
“a”
“a”

因此,请在代码中添加:

temp = temp.trim();

问题是当你发现一个变量的名字与你要从
for
循环中分离出来的名字相同时。你不应该
for
循环中分离出来。把
分离
改为
继续
,这样你就可以通过表达式继续解析,而不是添加在您的列表中至少有一个变量

if(arrays.contains(addArr)){ // duplicate 
    continue;
}

在解析表达式之前是否尝试删除空格?先删除空格,或添加空格作为分隔符,只会将结果
a
作为变量,将
a
作为数组。不知何故,使用此方法,我丢失了第二个变量
b
。解析完后修剪变量名如何?相同结果,仍然丢失
b
这给了我与首先删除空格相同的输出,我仍然丢失
b
变量,如上面的注释所述。