0

请帮我处理我的代码。我正在使用一个名为 tempAns 的数组列表,它包含值 [2, 9, 2]。我尝试添加最后两个数字,然后用正确的答案替换它们,因此结果将是 [2, 11]。但不知何故,输出总是 [9, 11]。似乎它正在删除重复的值。

   else if(scan.equals("+"))
            {
                double num2 = Double.parseDouble(tempAns.get(tempAns.size()-1));
                double num1 = Double.parseDouble(tempAns.get(tempAns.size()-2));
                double ans = num1 + num2;
                String stringAns = Double.toString(ans);
                System.out.println("before deleting: " +tempAns + "\n");

                tempAns.remove(tempAns.get(tempAns.size()-1));
                tempAns.remove(tempAns.get(tempAns.size()-1));

                System.out.println("before adding: " +tempAns);
                tempAns.add(stringAns);
                System.out.println(num1 + " + " +num2+ " = " +ans);
                System.out.println("after deleting: " +tempAns + "\n");
            }
4

6 回答 6

4

remove()方法使用该equals()方法来查找应该删除哪个对象。然后

 tempAns.remove(tempAns.get(tempAns.size()-1));

方法

 tempAns.remove(2);

并且第一个元素与等号匹配,列表带有[9, 2]. 然后,再次调用tempAns.remove(tempAns.get(tempAns.size()-1));,将删除另一个2,列表将是[9]

您可以使用该remove(index)方法或使用LinkedList替代ArrayList,并调用该removeLast()方法两次。

于 2012-10-05T18:05:37.310 回答
1
tempAns.remove(tempAns.get(tempAns.size()-1));
//above remove is evaluated to 
tempAns.remove(2);  // Removes the 2 at index 0   

问题是,您首先获取索引 2.. 处的值,即 2。现在您要删除值 2,这实际上删除了2索引 0..

您应该按索引删除:-

tempAns.remove(tempAns.size()-1);
于 2012-10-05T18:04:51.070 回答
1
 tempAns.remove(tempAns.get(tempAns.size()-1)); You shold do below
 tempAns.remove(tempAns.size()-1); //remove last
 tempAns.remove(tempAns.size()-1); //remove second last

原因是tempAns.get(tempAns.size()-1)返回2,它也在开始,所以 remove 将2在开始时删除。

公共布尔删除(对象o)

从此列表中删除第一次出现的指定元素(如果存在)。如果列表不包含该元素,则它不变。更正式地说,删除具有最低索引 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。如果此列表包含指定的元素(或等效地,如果此列表因调用而更改),则返回 true。

于 2012-10-05T18:05:03.337 回答
1

使用tempAns.remove(tempAns.size()-1)而不是使用tempAns.remove(tempAns.get(tempAns.size()-1));

于 2012-10-05T18:08:36.310 回答
1

问题是您在使用时使用的是从 AbstractCollection 继承的 remove 方法:tempAns.remove(tempAns.get(tempAns.size()-1));。根据您的描述,您需要从 ArrayList 中删除,即使用索引,因此您应该将调用更改为:tempAns.remove(tempAns.size()-1);

于 2012-10-05T18:11:37.497 回答
1

要考虑的一件事是,您可以合并检索 num1 和 num2 的位置以及删除它们的位置,如下所示:

        System.out.println("before deleting: " +tempAns + "\n");
        double num2 = Double.parseDouble(tempAns.remove(tempAns.size()-1));
        double num1 = Double.parseDouble(tempAns.remove(tempAns.size()-1));
        double ans = num1 + num2;
        String stringAns = Double.toString(ans);

        System.out.println("before adding: " +tempAns);
        tempAns.add(stringAns);
        System.out.println(num1 + " + " +num2+ " = " +ans);
        System.out.println("after deleting: " +tempAns + "\n");

前面的代码解决了您遇到的问题,并且可能更容易理解,因为您没有尝试跟踪项目在列表中的偏移量。这更接近于从堆栈中弹出列表,然后在计算值时将其推回。

于 2012-10-05T18:12:19.957 回答