Javaのようなオブジェクト指向言語を学べば1〜2日で習うであろう事に
オブジェクトの比較に==は使ってはいけないということ。
あろうことか、Javaを5年以上使っていながら
このミスを犯してしまったので、そのミスをまとめておく。
したかった事
- int配列が昇順でソートされたものが与えられる
- これを2つのスタックに順次pushしていく
- ただし、同一のスタックに同じ値は入れてはいけない
- どちらのスタックにも既に同じ値をpushしているのなら、それ以降の同一の値は破棄する。
- すべての値をpushし終わったら、2つのスタックトップを比較し、同一の値であれば一方を破棄する。
この実装が以下のコード
もちろんバグがあるのは13行目の
stackRight.peek() == stackLeft.peek()
の部分。
StackはInteger型(=オブジェクト)を格納するので
これをpeek(pop)すると、オブジェクトが戻る。
このため、戻り値を'=='で比較するとオブジェクトの比較なので意図した動作をしない。
対策
intにキャストするだけ。
13行目を
(int)stackRight.peek() == (int)stackLeft.peek()
とすればいい。
もちろん、2つのスタックを利用して、あれこれしているのが
そもそも見通しが悪いといえばそれまでなのだが。
反省点はIntegerなどのラッパークラスを軽視していたこと。
何も考えずにintとIntegerが変換されるので、
Stack操作がオブジェクトを対象としていることを意識していなかった。
Stackに限らず、Javaのライブラリは基本オブジェクトを対象としているので
同様のミスを犯さないように気をつける。