0

私のコードで私を助けてください。私は tempAns という名前の配列リストを使用しています。値 [2、9、2] が含まれています。最後の 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に使用して、メソッドを 2 回呼び出すことができます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されるため、削除は開始時に削除さ2れます。

public boolean remove(Object o)

指定された要素が存在する場合、このリストから最初に見つかった要素を削除します。リストに要素が含まれていない場合、要素は変更されません。より正式には、 (o==null ? get(i)==null : o.equals(get(i))) (そのような要素が存在する場合) となる最小のインデックス 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

考慮すべきことの 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 に答える