【发布时间】:2023-03-12 08:32:01
【问题描述】:
我在课堂上有以下代码...
String processor()
{
Stack<Character> stack = new Stack<>();
while (curr < infixExpr.length())
{
// assigning the current index position of string in infix expression to a variable to reduce amount of repeated code
Character element = infixExpr.charAt(curr);
if (isOperand(element))
{
postfixExpr += "" + element;
}
else if (element == '(')
{
stack.push(element);
}
else if (element == ')')
{
while (!stack.peek().equals('('))
{
postfixExpr += stack.pop(); // adding all items in stack after ( and before )
}
stack.pop(); // this should pop the stack of the waiting pushed ( paren and remove it from our postfix expression, basically ignoring it
// right paren found to trigger this else if statement was never pushed onto the stack nor assigned to the postfix expression, also ignored
}
else //*must be an operator then
{
while (OrdOpsTable.getOperatorPrecedence(stack.peek(), true) > OrdOpsTable.getOperatorPrecedence(element, false)) // flag, 'true' to signify this is from the stack. ALso, compare if it has higher precedence over the current operator
{
postfixExpr += stack.pop(); // placing found operator to end of postfix expression
}
stack.push(element);
}
curr++;
}
while (!stack.isEmpty())
{
postfixExpr += stack.pop();
}
return postfixExpr;
}
在方法“getOperatorPrecedence”参数中,我有一个名为stack的Stack实例,调用方法peek,返回一个Character Object。正如字段 element 所示,元素是字符对象类型。我在方法参数中创建了一个简单的标志布尔值以使其变得简单。
所以,“getOperatorPrecedence”在另一个名为“OrdOpsTable”的类文件中...
public final class OrdOpsTable<T> extends ArrayList
{
// INITIALIZERS
private static Character[] table = {'(','+','-','*','/','%','^'};
private static ArrayList<OperatorValues> ON_stack = new ArrayList<>();
private static ArrayList<OperatorValues> ON_curr = new ArrayList<>();
private T FROM_stack = null;
private T FROM_curr = null;
// CONSTRUCTOR
private OrdOpsTable(T curr)
{
setOperatorPrecedence();
if (curr.getClass() == Stack.class)
this.FROM_stack = curr;
else
this.FROM_curr = curr;
}
// METHODS
private static void setOperatorPrecedence()
{
// this method just sets the unique values of each operator to two arrays
int i = 0;
for (char op : table)
{
switch(op)
{
case '(':
ON_stack.add(i, new OperatorValues(op, 0));
ON_curr.add(i, new OperatorValues(op, 100));
break;
case '+':
ON_stack.add(i, new OperatorValues(op, 2));
ON_curr.add(i, new OperatorValues(op, 1));
break;
case '-':
ON_stack.add(i, new OperatorValues(op, 2));
ON_curr.add(i, new OperatorValues(op, 1));
break;
case '*':
ON_stack.add(i, new OperatorValues(op, 4));
ON_curr.add(i, new OperatorValues(op, 3));
break;
case '/':
ON_stack.add(i, new OperatorValues(op, 4));
ON_curr.add(i, new OperatorValues(op, 3));
break;
case '%':
ON_stack.add(i, new OperatorValues(op, 4));
ON_curr.add(i, new OperatorValues(op, 3));
break;
case '^':
ON_stack.add(i, new OperatorValues(op, 5));
ON_curr.add(i, new OperatorValues(op, 6));
break;
}
i++;
}
}
public static int getOperatorPrecedence(Object curr, boolean FROM_stack)
{
setOperatorPrecedence();
if (FROM_stack)
{
return ON_stack.get(ON_stack.indexOf(curr)).value;
}
else
{
return ON_curr.get(ON_stack.indexOf(curr)).value;
}
}
/* SUBCLASS */
private static class OperatorValues
{
// FIELDS
private char operator;
private int value;
// CONSTRUCTOR
OperatorValues(char operator, int value)
{
this.operator = operator;
this.value = value;
}
// METHOD
char getOperator()
{
return this.operator;
}
int getValue()
{
return this.value;
}
public String toString()
{
return this.operator;
}
}
我需要帮助的是找到一种方法,为
的两个实例正确返回 OperatorValue 子类字段 valuereturn ON_stack.get(ON_stack.indexOf(curr)).value;
and
return ON_curr.get(ON_stack.indexOf(curr)).value;
我收到以下错误...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:418)
at java.util.ArrayList.get(ArrayList.java:431)
at OrdOpsTable.getOperatorPrecedence(OrdOpsTable.java:79)
at PostfixParser.processor(PostfixParser.java:57)
at InfixPostfixTester.main(InfixPostfixTester.java:78)
当我调试并遵循这个时,问题出现在“字符”类“等于”中。首先,当我强制进入有问题的第一个 return 语句时,它会转到 ArrayList 中的 indexOf() ...
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
当调试器在此处点击 .equals 方法时,它会进入 Character 类...
public boolean equals(Object obj) {
if (obj instanceof Character) {
return value == ((Character)obj).charValue();
}
return false;
}
这里的问题是这个 equals 方法中的 IF 语句在这个比较中失败了。它似乎将 obj 与我定制的 OperatorValues 类的 toString() 进行比较,它显然不是 Character 类的实例。所以,它失败了,因为它将“(”作为一个字符进行比较。我需要它来比较 '(' 以在此方法中触发 'true'。
例如,我在一个数组中分配了 char '(' int 为 '0',在另一个数组中分配了 '100',正如您在上面的 OrdOpsTable 类中的 setOperatorPrecedence() 方法中看到的那样。当字符此处调用 class equals() 方法而不使用 OperatorValues 类的 toString(),我的调试器说在此 equal 方法中 curr 的 '(' 的内联值显示,“obj: OrdOpsTable$OperatorValues@636。
如果有办法让我在 OperatorValues 中的 toString() 方法返回一个字符而不是字符串。如果我这样做,这当然会导致错误。对您将在这里做什么有什么建议吗?
*注意:如果我需要为您提供更多信息,请告诉我。这是一个班级的家庭作业,我花了很多时间在这部分上,我一直在不懈地尝试。我需要一些外包帮助来了解我所缺少的。
【问题讨论】:
-
请更正代码并确保发布编译错误的代码。
-
不管它们的相关性如何,用字符串替换标识符名称会使代码难以阅读和混淆。您需要提供一个可以编译的minimal reproducible example。请相应地编辑您的问题。
-
完成,感谢建议的编辑人员。我是新来的。 :)
标签: java equals instanceof