从表达式中分离 variables/arrays,并删除重复项?
Separating variables/arrays from an expression, and deleting duplicates?
我正在从表达式中分离出变量和数组名称,然后尝试删除重复项。我的代码适用于大多数表达式,但是当存在诸如 (a + A[a*2-b])
的表达式时,我 运行 遇到了麻烦,因为由于 [=],我的程序将两个 a's
识别为单独的变量17=] 在第一个 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);
}
所以你的问题是你有两个变量:"a"
和 "a "
。 String has a nice method called trim()
.
所以添加到您的代码中:
temp = temp.trim();
temp 会去掉两边的空格。
问题是当您找到一个同名变量时,您正在跳出 for
循环。您不应该 break
超出 for
循环。将 break
更改为 continue
以便您可以继续解析表达式但不将该变量添加到列表中。
if(arrays.contains(addArr)){ // duplicate
continue;
}
我正在从表达式中分离出变量和数组名称,然后尝试删除重复项。我的代码适用于大多数表达式,但是当存在诸如 (a + A[a*2-b])
的表达式时,我 运行 遇到了麻烦,因为由于 [=],我的程序将两个 a's
识别为单独的变量17=] 在第一个 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);
}
所以你的问题是你有两个变量:"a"
和 "a "
。 String has a nice method called trim()
.
所以添加到您的代码中:
temp = temp.trim();
temp 会去掉两边的空格。
问题是当您找到一个同名变量时,您正在跳出 for
循环。您不应该 break
超出 for
循环。将 break
更改为 continue
以便您可以继续解析表达式但不将该变量添加到列表中。
if(arrays.contains(addArr)){ // duplicate
continue;
}