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

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

ただいまの
回答率

87.36%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 908

score 1

前提・実現したいこと

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() + "の四角形です。" );
  } 
}
public class Square extends Rectangle {
     private double area;
    Square() {
         super();
         super.setSize(10, 10);
         computeArea();
     }
     Square(double w) {
         super();
         super.setSize(w, w);
         computeArea();
     }
     void computeArea() {
         area = super.getWidth() * super.getHeight();
    }
     @Override
     public double getArea() {
         return area;
    }

     @Override
     public void identify() {
         System.out.println("私は面積が" + getArea() + "の正方形です。" );
     }
}
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() + "の円です。" );
      } 
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

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

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/12/02 00: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の四角形です。

    と出力されるので、想像と逆順になっているところが、
    > わかったようなわからないような...
    と書いたとおりですが、どうですかね。

    キャンセル

  • 2020/12/02 00:49

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

    キャンセル

  • 2020/12/02 01:07

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

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

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