【问题标题】:JAVA: Comparing an object from another class to an objectJAVA:将另一个类中的对象与对象进行比较
【发布时间】: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 子类字段 value
return 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


【解决方案1】:

我想通了,我将 Character 类的所有内容更改为 String 类,并在我的 OrdOpsTable 类中的 getOperatorPrecedence() 方法中强制比较我的自定义 OperatorValues 类的本机类到 String 类,我这样做了...

return ON_stack.get(ON_stack.toString().indexOf(curr)).getValue();

感谢所有提供帮助的人,不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2018-08-04
    • 1970-01-01
    • 2019-07-26
    • 2016-07-24
    • 1970-01-01
    • 2015-05-23
    • 2018-01-12
    相关资源
    最近更新 更多