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

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

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

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

Q&A

解決済

2回答

2041閲覧

Java リストの使いかたについて

white_bread

総合スコア7

Java

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

0グッド

0クリップ

投稿2016/07/10 09:11

###リストの中で1番面積が大きい図形を返す
Javaのコードでmaxの中身が分かりません。 リストの使いかたがいまいち分からず、、、教えてください。

###該当のソースコード
public class CalcFigure {

/** * リストlの中で一番面積が大きい図形を返す。 * 最大のものが複数あった場合は任意の要素を返すこととする。 * @param l Figureのリスト * @return lの中で面積が一番大きい要素 */ public static Figure max(List<Figure> l){ return ; } public static void main(String[] arg){ Scanner sc = new Scanner(System.in); List<Figure> l = new ArrayList<Figure>(); String s = sc.next(); if(s == "end"){ System.out.println(max(l)); }

else if(s == "c"){
double r = sc.nextDouble();
l.add(new Circle(r));
}
else if(s == "r"){
double width = sc.nextDouble();
double height = sc.nextDouble();
l.add(new Rectangle(width,height));
}
}
}

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

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

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

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

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

guest

回答2

0

ベストアンサー

CircleやRectangleはFigureを継承しているものとすると、面積を求めるメソッドをFigureクラスに抽象メソッドとして設定するのがいいでしょう。

java

1abstract class Figure{ 2 // 図形の面積を求めるメソッド 3 abstract double area(); 4}

そしてCircleやRectangleで具体的に面積を求めるメソッドを実装します。
そしてtamyさんの方法で最大の面積の図形を探します。面積を出すには先程のareaメソッドを使います。

java

1public static Figure max(List<Figure> list) 2{ 3 Figure ret = null; 4 double maxArea = 0.0; 5 for(Figure f : list) { 6 double area = f.area(); 7 if(maxArea < area) { 8 maxArea = area; 9 ret = f; 10 } 11 } 12 return ret; 13}

Stringの比較にはequalsを使います。今のままs.equals()を使うとNullPointerExceptionになるので、処理手順を変えます。

java

1public static void main(String[] arg) { 2 Scanner sc = new Scanner(System.in); 3 List<Figure> l = new ArrayList<Figure>(); 4 String s; 5 6 while ((s = sc.next()).equals("end")) { 7 if (s.equals("c")) { 8 double r = sc.nextDouble(); 9 l.add(new Circle(r)); 10 } else if (s.equals("r")) { 11 double width = sc.nextDouble(); 12 double height = sc.nextDouble(); 13 l.add(new Rectangle(width, height)); 14 } 15 } 16 System.out.println(max(l)); 17}

投稿2016/07/10 09:56

編集2016/07/10 12:14
swordone

総合スコア20649

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

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

white_bread

2016/07/10 10:09

ご回答ありがとうございます。補足いたします。 Circle・Rectangleクラス及びFigureインターフェースを事前に作成する指示があり、以下のように作成しています。
white_bread

2016/07/10 10:09

public class Circle implements Figure { private double r; public Circle(double r) { super(); this.r = r; } @Override public double getArea() { return r*r*Math.PI; } @Override public String toString() { return "circle: "+getArea(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i=0; i<n; i++) { double r = sc.nextDouble(); System.out.println(new Circle(r)); } } }
white_bread

2016/07/10 10:09

public class Rectangle implements Figure { private double width, height; public Rectangle(double width, double height) { super(); this.width = width; this.height = height; } @Override public double getArea() { return width*height; } @Override public String toString() { return "rectangle: "+getArea(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i=0; i<n; i++) { double w = sc.nextDouble(); double h = sc.nextDouble(); System.out.println(new Rectangle(w, h)); } } }
white_bread

2016/07/10 10:10

public interface Figure { /** * 図形の面積を計算する * @return 図形の面積 */ public double getArea(); }
swordone

2016/07/10 10:18

であれば、上記の私の回答ほぼそのままで行けるはずです。
white_bread

2016/07/10 10:25

return f がエラーになります。
swordone

2016/07/10 10:29

returnするものを間違えました。正しくはretの方です。
white_bread

2016/07/10 10:32

public class CalcFigure { /** * リストlの中で一番面積が大きい図形を返す。 * 最大のものが複数あった場合は任意の要素を返すこととする。 * @param l Figureのリスト * @return lの中で面積が一番大きい要素 */ public static Figure max(List<Figure> l){ Figure ret = null; double maxArea = 0.0; for(Figure f : l){ double area = f.getArea(); if(maxArea < area){ maxArea = area; ret = f; } } return ret; } public static void main(String[] arg){ Scanner sc = new Scanner(System.in); List<Figure> l = new ArrayList<Figure>(); String s = null; while(s != "end"){ s = sc.next(); if(s == "c"){ double r = sc.nextDouble(); l.add(new Circle(r)); } else if(s == "r"){ double width = sc.nextDouble(); double height = sc.nextDouble(); l.add(new Rectangle(width,height)); } } System.out.println(max(l)); } }
white_bread

2016/07/10 10:33

おかげさまでここまできましたが、どこが変なのでしょうか?
swordone

2016/07/10 10:58

「どこが変か」と言われてもわかりません。何が起きたのですか?
white_bread

2016/07/10 11:46

endと入力してもプログラムが終了しません。
white_bread

2016/07/10 12:27

無事解決できました!最後までありがとうございますm(__)m
guest

0

Stream とか使えばもっとスマートに書けるはずだけど,とりあえず動く(であろう)コードで…

java

1public static Figure max(List<Figure> list) 2{ 3 Figure ret = null; 4 double maxArea = 0.0; 5 for(Figure f : list) { 6 double area = f.getWidth() * f.getHeight(); 7 if(maxArea < area) { 8 maxArea = area; 9 ret = f; 10 } 11 } 12 return f; 13}

投稿2016/07/10 09:42

tamy

総合スコア442

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

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

white_bread

2016/07/10 12:27

ご回答ありがとうございますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問