質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1682閲覧

Javaにおける図形の配列をスタックとキューの配列に入れて表示させるプログラムについて

Grimro

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/12/01 04:40

編集2020/12/01 15:11

前提・実現したいこと

Javaで図形の配列をスタックとキューの配列に格納して表示するプログラムをEclipseを用いて作成しています。メインクラスであるStackAndQueueクラスとは別にMyStackクラスとMyQueueクラスをそれぞれ作成し、そこで定義したメソッドを用いて配列の内容を表示したいです。前提条件として、格納される図形配列をfigure1(要素数;9)とし、その配列の要素数よりも要素数が小さいスタック(要素数;8)とキュー(要素数;7)の配列を定義します。

発生している問題・エラーメッセージ

これまでpushとgetを用いて表示させるやり方をずっと模索していたのですが、Queueの表示はうまくいったようです。しかし、Stackの表示が「私は面積が1600.0の正方形です。」で止まってしまい、その後ArrayIndexOutOfBoundsExceptionエラーが出てしまいました。最後のエラー箇所として、Stackでは図形を8つ表示させれば良いのですが、これはどのように修正すれば良いでしょうか。

該当のソースコード

Java
[コンソール出力結果]
<figures1の図形>
私は面積が200.0の四角形です。
私は面積が200.0の四角形です。
私は面積が600.0の四角形です。
私は面積が1256.6370614359173の円です。
私は面積が1256.6370614359173の円です。
私は面積が2827.4333882308138の円です。
私は面積が100.0の正方形です。
私は面積が1600.0の正方形です。
私は面積が2500.0の正方形です。

<Queueの図形>
私は面積が200.0の四角形です。
私は面積が200.0の四角形です。
私は面積が600.0の四角形です。
私は面積が1256.6370614359173の円です。
私は面積が1256.6370614359173の円です。
私は面積が2827.4333882308138の円です。
私は面積が100.0の正方形です。

<Stackの図形>
私は面積が2500.0の正方形です。
私は面積が1600.0の正方形です。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8
at objects.MyStack.pop(MyStack.java:35)
at objects.StackAndQueue.main(StackAndQueue.java:61)

[ソースコード]
{StackAndQueueクラス(メインクラス)}

package objects; public class StackAndQueue { public static void main(String[] args) { Figure[] figures1 = new Figure[9]; int i = 0; Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(10, 20); Rectangle r3 = new Rectangle(20, 30); figures1[i++] = r1; figures1[i++] = r2; figures1[i++] = r3; Circle c1 = new Circle(); Circle c2 = new Circle(20); Circle c3 = new Circle(30); figures1[i++] = c1; figures1[i++] = c2; figures1[i++] = c3; Square s1 = new Square(); Square s2 = new Square(40); Square s3 = new Square(50); figures1[i++] = s1; figures1[i++] = s2; figures1[i++] = s3; System.out.println("<figures1の図形>"); for(int j = 0; j<figures1.length; j++) { figures1[j].identify(); } System.out.println(); MyQueue queue = new MyQueue(7); int n = 0; try{ while(queue.isFull() == false) { queue.put(figures1[n]); n++; } } catch (ArrayIndexOutOfBoundsException e) { } System.out.println("<Queueの図形>"); for(int j = 0; j<7; j++) { queue.get().identify(); } System.out.println(); MyStack stack = new MyStack(8); try { while(stack.isFull() == false) { stack.push(figures1[n]); n++; } } catch (ArrayIndexOutOfBoundsException e) { } System.out.println("<Stackの図形>"); for(int j = 0; j<8; j++) { stack.pop().identify(); } } }

{MyQueueクラス(キュークラス)}

package objects; public final class MyQueue { private Figure[] Buff; private int start; private int end; private int count; Figure x; public MyQueue(int size) { Buff = new Figure[size]; start = 0; count = 0; } public boolean isEmpty() { if(count == 0) { return true; } else { return false; } } public boolean isFull() { if(count > Buff.length) { return true; } else { return false; } } public void put(Figure x) { end = start + count; Buff[end] = x; count++; } public Figure get() { x = Buff[start++]; count--; return(x); } }

{MyStackクラス(スタッククラス)}

package objects; public final class MyStack { private Figure[] Buff; private int sp; private int count; Figure x; public MyStack(int size) { Buff = new Figure[size]; sp = 0; count = 0; } public boolean isEmpty() { if (count == 0) { return true; } else { return false; } } public boolean isFull() { if (count >= Buff.length) { return true; } else { return false; } } public void push(Figure x) { Buff[sp] = x; sp++; count++; } public Figure pop() { sp--; x = Buff[sp]; count--; return(x); } }

以上のクラスとは別のRectangleクラスで定義したidentifyメソッドを以下のように定義しました。SquareクラスとCircleクラスも同様です。

package objects; public class Rectangle extends Figure { private double height = 0; private double width = 0; private double area; Rectangle() { this.width = 20; this.height = 10; area = this.width * this.height; } Rectangle(double w, double h) { this.width = w; this.height = h; area = this.width * this.height; } void setWidth(double w){ this.width = w; area = this.width * this.height; } void setHeight(double h) { this.height = h; area = this.width * this.height; } void setSize(double w, double h) { setWidth(w); setHeight(h); } double getWidth() { return this.width; } double getHeight() { return this.height; } @Override public double getArea() { return area; } @Override public void identify() { System.out.println("私は面積が" + getArea() + "の四角形です。" ); } }

package

1 2public class Square extends Rectangle { 3 private double area; 4 Square() { 5 super(); 6 super.setSize(10, 10); 7 computeArea(); 8 } 9 Square(double w) { 10 super(); 11 super.setSize(w, w); 12 computeArea(); 13 } 14 void computeArea() { 15 area = super.getWidth() * super.getHeight(); 16 } 17 @Override 18 public double getArea() { 19 return area; 20 } 21 22 @Override 23 public void identify() { 24 System.out.println("私は面積が" + getArea() + "の正方形です。" ); 25 } 26}
package objects; public class Circle extends Figure { private double radius = 0; private double area; Circle() { this.radius = 20; area = this.radius * this.radius * Math.PI; } public Circle(double r) { this.radius = r; area = this.radius * this.radius * Math.PI; } void setRadius(double r){ this.radius = r; area = this.radius * this.radius * Math.PI; } double getHeight() { return this.radius; } @Override public double getArea() { return area; } @Override public void identify() { System.out.println("私は面積が" + getArea() + "の円です。" ); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

何を出したいか、がちょっとよくわかりませんでした。クラス名の「Rectangle」等でしょうか。
その場合はgetClass().getSimpleName() などを使うと良いと思います。

あとはおそらくですが、
実際におきていることとしては、インスタンスを println したときにはそのクラスの toString() が呼ばれてしまうので、
例えば

public String toString() { return "長方形"; }

と書けば「長方形」などを得ることができます。
しかしこれは乱暴なので

public String getName() { return "長方形"; }

のような新しいメソッドを作り、

System.out.println(queue.get().getName()); のように取り出すなどでどうでしょうか。

投稿2020/12/01 05:03

tetsunosuke

総合スコア1292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Grimro

2020/12/01 07:26

ご回答していただきありがとうございます。実現したいことの説明が不足していましたね。望ましい出力結果としては、<figures1の図形>にて出力させたように、<Queueの図形>と<Stackの図形>のそれぞれについて、figures1で定義した9つの図形配列を順番に表示させるようなものを考えています。しかし、このときにfigures1で定義した配列の要素数が9に対して、<MyStackクラス>て定義した変数;stackの要素数が8、<MyQueueクラス>にて定義した変数;queueの要素数は7という制限が前提となっており、この範囲内でstackとqueueの性質を備えた表示がコンソールに出れば良いというプログラムを作成しています。ArrayIndexOutOfBoundsというエラーが出ないようにtry&catchを用いていますが、この使い方が間違えている可能性もあるかもしれません。また、<Queueの図形>と<Stackの図形>のそれぞれで表示される図形の順番は逆同士になります。実現したいコンソールの出力結果のイメージを以下に記します。 <figures1の図形> 私は面積が200.0の四角形です。//1番目 私は面積が200.0の四角形です。//2番目 私は面積が600.0の四角形です。//3番目 私は面積が1256.6370614359173の円です。//4番目 私は面積が1256.6370614359173の円です。//5番目 私は面積が2827.4333882308138の円です。//6番目 私は面積が100.0の正方形です。//7番目 私は面積が1600.0の正方形です。//8番目 私は面積が2500.0の正方形です。//9番目 <Queueの図形> 私は面積が100.0の正方形です。//7番目 私は面積が2827.4333882308138の円です。//6番目 私は面積が1256.6370614359173の円です。//5番目 私は面積が1256.6370614359173の円です。//4番目 私は面積が600.0の四角形です。//3番目 私は面積が200.0の四角形です。//2番目 私は面積が200.0の四角形です。//1番目 <Stackの図形> 私は面積が200.0の四角形です。//1番目 私は面積が200.0の四角形です。//2番目 私は面積が600.0の四角形です。//3番目 私は面積が1256.6370614359173の円です。//4番目 私は面積が1256.6370614359173の円です。//5番目 私は面積が2827.4333882308138の円です。//6番目 私は面積が100.0の正方形です。//7番目 私は面積が1600.0の正方形です。//8番目
tetsunosuke

2020/12/01 09:24

なるほど > ハッシュコード表記になっているらしく、ちゃんとした文字列で出力し直したいです。 と書いてあったのでその部分について答えたのですが、 その時点で中に入っているキュー・スタックを「すべて列挙して」かつ「ハッシュではなく」ということだったんですね。 ハッシュではない、のほうは 各クラスに idenfityを用意すればよいというのは大丈夫そうでしょうか。 取り出しの方ですが、現在作成されているクラスのメソッドでは難しいように思います。 そもそもJavaには標準のクラスとして、QueueやStackがjava.utilパッケージにあります。 そちらの実装を参考にすると、「取り出して削除」と「参照するがそれは削除しない」メソッドがあることがわかります。 またこれらのクラス(インターフェース)はIterableなので、普通にforで列挙できます。
Grimro

2020/12/01 13:49

確かにjava.utilパッケージの標準クラスであるQueueやStackを用いることが無難であるように思われますが、今回のプログラムでは、独自に作成したQueueとStackのクラスを基に図形の配列を格納するという条件があります。考えを続けたところ、どうやら修正箇所としては、queue.getメソッドとstack.pushメソッドに対してSystem.out.printlnを用いること自体が該当するようです。これを修正するには、<figures1の図形>のようにfor文を用いてidentifyを適用させることが考えられるかもしれませんね。getメソッドとpushメソッドをidentifyメソッドにつなげる方針でまた試行錯誤してみます。
tetsunosuke

2020/12/01 14:01

ちょっと学習的要素で実装してみているのですね。 提示されたコードが一部だったので実際にやってみるのが面倒で試しておらず。 また、コードについてはコードフォーマット表示をしておくことをおすすめします。
Grimro

2020/12/01 14:12

すみません!初めてteratailにて質問をしたので、コードを見やすいように表示させることもできていなかったですね。ご指摘のほどありがとうございます。ただ今コードフォーマット表示にしましたので、ご参照していただけたら幸いです。
tetsunosuke

2020/12/01 14:59

> SquareクラスとCircleクラスも同様です。 こっちもあると助かります!そのまま試せるので!
Grimro

2020/12/01 15:08

つい先ほどキューの方が上手く行きました!しかし、最後のエラーとして、Stackの方が8つの図形配列をすべて参照できていない状態となっています。これまでの進捗を含めてさらに編集し直したので、お手数かけますが、再度質問箇所をご参照できますか?
tetsunosuke

2020/12/01 15:40

わかったようなわからないような... ここは修正が最低限必要に思います。 MyStack stack = new MyStack(8); n = 0; // ここで初期化していないため、nが7から次のループが始まってしまう 結果、 while(stack.isFull() == false) {// この条件を満たす前に  stack.push(figures1[n]); // figures1[9] を参照しようとして例外が発生する  n++; } という事象のように思います。 n = 0で最初期化した場合には <Stackの図形> 私は面積が1600.0の正方形です。 私は面積が100.0の正方形です。 私は面積が2827.4333882308138の円です。 私は面積が1256.6370614359173の円です。 私は面積が1256.6370614359173の円です。 私は面積が600.0の四角形です。 私は面積が200.0の四角形です。 私は面積が200.0の四角形です。 と出力されるので、想像と逆順になっているところが、 > わかったようなわからないような... と書いたとおりですが、どうですかね。
Grimro

2020/12/01 15:49

そちらの修正で大丈夫です!これでようやく全て解決となりました。無事に実現したい結果を出すことができ、とても親切に回答して下さってありがとうございました!自分はまだまだプログラミング自体が初心者ですが、これからも今回の試行錯誤を活かせるように精進して参ります!
tetsunosuke

2020/12/01 16:07

最終的には割とシンプルにロジックの問題だったので動くところのコードが提示されたのと問題が具体化されたのでたどり着くことができました。良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問