私は2つのスタックを取るs1
とs2
、いくつかの値でそれらを初期化し、最終的には、両方持っている-1024
そこのようにtop
。
さて、あるif
状態で両方のピークを比較すると、結果は間違っています。例えば:
if (s1.peek() == s2.peek()) --> returns false
両方のピークが-1024
値として持っている場合でも。
だが
さまざまな変数の値を取得して比較すると、問題なく機能します。例えば:
int first = s1.peek();
int second = s2.peek();
if (first == second) --> returns true
他の値(例:10)でも同じことを確認しました。その場合、直接ピーク比較は正常に機能します。
ピークを直接比較することで何か問題が発生しているのでしょうか、それとも何らかの形で比較されている値に関連しているのでしょうか。
以下は最小限のコード化された例です(私は最小スタック問題を実装するための練習としてこれを行っていました):
public class MinStack {
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(512);
minStack.push(-1024);
minStack.push(-1024);
minStack.push(512);
minStack.pop();
System.out.print(minStack.getMin());
minStack.pop();
System.out.print(minStack.getMin());
minStack.pop();
System.out.print(minStack.getMin());
}
Stack<Integer> originalStack;
Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
originalStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
originalStack.push(x);
if(minStack.isEmpty() || minStack.peek() >= x)
minStack.push(x);
}
public void pop() {
if(originalStack.peek() == minStack.peek())
minStack.pop();
originalStack.pop();
}
public int top() {
return originalStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
これはInteger
インターンが原因で発生します。java.lang.Integer
などの小さな値を表すオブジェクト10
は事前に製造されているため、10
2つの別々のスタックでオートボックス化をプッシュすると、同じオブジェクトがプッシュされます。
コード内のあなたがいる場所に到達するpeek()
と、同じオブジェクトがに対して返されますが10
、2つの異なるオブジェクトがに対して返され-1024
ます。その==
ため10
、はtrueを返しますが、は返しません-1024
。
-ed値int
を受け取る変数を追加するとpeek()
、自動アンボックス化int
によって、から同じ値のが収集されるInteger
ため、のコードが-1024
再び機能します。
条件==
付きequals
で次のように置き換えることで、これを修正できます。
if (s1.peek().equals(s2.peek())) --> returns true
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加