2011-10-17 15 views
3

だから、私が書いたこの大きな方法があります。スタックが与えられた場合、スタックを返します。キューが指定されている場合は、キューを返します。これは多くの再帰を使用し、キュー/スタックを受け入れ、それに応じて変更された同じキュー/スタックを返します。スタックとキューを受け入れるメソッドを記述する方法は?

私のメソッドをコピー/ペーストしたくないので、内部で使用されているタイプを変更することができます。この汎用メソッドを作成する方法はありますか?のように、それは古いコレクションを受け入れ、それを再生しますか?私はCollectionを使ってみましたが、その問題はスタック/キューで使用できる.remove()がないことです。

ご協力いただければ幸いです。

ありがとうございました。

+1

スタックのJavadocには、Dequeが望ましいと記載されています。可能であれば、Stackを省略することもできます。 – Puce

答えて

2

あなたはCollectionを使うことができますが、その後は削除操作のまわりで特別なケースを扱うことができます。もちろん、2つのコレクションではないコレクションを取得したときに、何をすべきかを把握しなければなりません。

if (myCollection instanceof Queue) { 
    ((Queue)myCollection).remove(); 
} else if (myCollection instanceof Stack) { 
    ((Stack)myCollection).remove(thingy); 
} else { 
    // Oops! Now what? 
} 
+0

これは内部的には実装できますが、パブリックAPIはキューまたはスタックでの受け渡しのみを許可します。 –

+0

おかげさまで多くのgoto10さん、他の方はお答えしました。これは私の目的のために完全に働いてしまった。私はこれをメソッドに入れ、挿入用に別のメソッドを作成しました。これは一般的なコレクションでうまくいきました。 1つの細かいディテールはinstanceOfではなくinstanceofです(つまり、Oは大文字ではありません)。再度、感謝します。 –

+0

それはあなたのために働いてうれしいと私はエラーを修正しました。 – goto10

3

メソッドをプライベートにして、スタックをとるメソッドとキューを取るメソッドの2つのパブリックメソッドを作成します。これらの各メソッドをキャストして、プライベートメソッドを呼び出した結果を返します。そうすることで、特定のメソッドシグニチャを持ちながら繰り返しを避けることができます。

+0

+1私はあまりにも言うつもりだった。 –

+0

問題はプライベートメソッドが今のところスタックを受け入れるだけなので、キューを受け入れる方法と、その上で.remove()と.add()を呼び出すだけでキューとスタックにはJavaのメソッドがあります。基本的にどのような型の大きなメソッドは私にそれをスタックとキューを与えることができると私はそれらのスタックやキューで使用する必要がキャストを受け入れる必要がありますか? –

+0

@ user999674:それはあなたの方法が実際に何をするかによって大きく異なります。キューとスタックは異なるアクションに対して最適化されているので、入力を一方または両方に制限したい場合もあれば、代わりに 'List'を提供する必要がある場合もあります。また、非特定のロジックを別のメソッドに抽象化し、基になるアイテムのアイテムを追加および削除する方法を知っている何らかのラッパーを渡すこともできます。可能性はかなり広大で、あなたは本当に良い答えを与えるのに十分な情報を提供していません。私はちょうどそれが最初に提起されたように質問に答えました。 – StriplingWarrior

1

キューとスタックにはいずれもremove()メソッドがありますが、メソッドは同じではありません。このため、Javaはコードをコンパイルするときに呼び出すメソッドを知る必要があります。 2つの別々の方法が必要です。申し訳ありません。

1

StackとQueueの両方から必要な操作を持つインターフェイスを作成する必要があります。両方のインターフェイスで再帰/操作を使用する必要があるためです。

この新しいインターフェイスには、スタックとキューのインスタンスに依存する2つの具体的なクラスがあり、次に多態性が魔法になります。

'getUnderlyingCollection()'のメソッドを使用して、適切なキャストの後に実際のスタックまたはキューを持つことができますが、多態性操作を達成すると、再帰アルゴリズムがより一般的になります。

0

java.util.Stackjava.util.Queueと推測します。 Queueは独自のremove()メソッドを定義しています。 Stackはメソッドを継承していますので、実際にはpop()を意味しますか?

つの方法は、心に春:

  • は常にnullそのうちの1つは、2つのパラメータでプライベートメソッドを呼び出し、両方の2つのパブリックメソッドのオーバーロードを提供します。

  • 2つのプライベートメソッドのそれぞれに匿名の内部クラス定義(または十分に大きい場合は完全な具象クラス定義)を使用して、必要な共通メソッドを持つインターフェイスを定義します。

どれを選択するかは、内部で行う必要がある醜い条件付きメソッド呼び出しの数によって決まります。 OO-puristは、インタフェースの実装を無関係に選択します。 :-)

関連する問題