こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クラスのフィールドの比較方法

2つのクラスのフィールドを比較して、その結果を以下のように表示させたいのですが、どのようにプログラミングをすればいいのでしょうか?


class Car
{
String carname;
int height;
int width;
int length;
}

class Garage
{
String garagename;
int height;
int width;
int depth;
}

public class example {
public static void main (String[] args) throws IOException
{
Car car[];
car = new Car[5];

System.out.println("車の情報を入力してください。");

BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in);

for(int i=0; i<5; i++){
car[i] = new Car();

System.out.println(i+1 + "台目の車の名前を入力してください。");
String str1 = br1.readLine();
System.out.println("車の高さを入力してください。");
String str2 = br1.readLine();
System.out.println("車の幅を入力してください。");
String str3 = br1.readLine();
System.out.println("車の長さを入力してください。");
String str4 = br1.readLine();

int h1 = Integer.parseInt(str2);
int w1 = Integer.parseInt(str3);
int l1 = Integer.parseInt(str4);

car[i].carname = str1;
car[i].height = h1;
car[i].weith =w1;
car[i].length =l1;
}

for(int i=0; i<5; i++){
garage[i] = new Garage();

System.out.println(i+1 + "つ目の車庫の名前を入力してください。");
String str5 = br2.readLine();
System.out.println("車庫の高さを入力してください。");
String str6 = br2.readLine();
System.out.println("車庫の幅を入力してください。");
String str7 = br2.readLine();
System.out.println("車庫の長さを入力してください。");
String str8 = br2.readLine();

int h2 = Integer.parseInt(str6);
int w2 = Integer.parseInt(str7);
int d2 = Integer.parseInt(str8);

garage[i].garagename = str2;
garage[i].height = h2;
garage[i].weith =w2;
garage[i].depth =d2;
}
}

出力例
garage1 car3
garage2 car5
garage3 car4
garage4 car2
garage5 car1

よろしくお願いします。

投稿日時 - 2007-12-17 13:00:09

QNo.3605425

すぐに回答ほしいです

質問者が選んだベストアンサー

> 2つのクラスのフィールドを比較して
車のサイズと車庫のサイズを比較する要求なら、それは基本的なビジネスロジックですから、個々のアプリケーション側でやるべきことではありません。たぶん、車の側が、車庫に対する比較能力を持つのが妥当でしょう(車庫側も車に対する比較能力を持ってもよろしいです)。なお、intはふさわしくないので、以下のサンプルプログラムではdoubleを使用しました。あなたがJava 1.5より上を使っていなければ、String.format()メソッドは使えませんから、java.text.DecimalFormatを使ってdoubleの値を書式化してください。
---------------------------------------------------
import java.io.*;
import java.util.*;

class Car{
String carname;
double height;
double width;
double length;
private String garageCheckMessage;

public boolean checkGarage(Garage g){
double h = g.height - height;
double w = g.width - width;
double l = g.depth - length;
garageCheckMessage = String.format
("高さ余裕:%.2f 幅余裕:%.2f 奥行き余裕:%.2f", h, w, l);
return (h > 0 && w > 0 && l > 0);
}

public String getGcheck(){
String copy = garageCheckMessage;
garageCheckMessage = "--まだ新たな比較が行われていない--";
return copy;
}

public String checkResult(Garage g){
String rs = checkGarage(g) ?
"この車(" + carname + ")はこの車庫(" + g.garagename + ")に入ります"
: "この車(" + carname + ")はこの車庫(" + g.garagename + ")に入りません";
return rs + "\n" + getGcheck() + "\n";
}
}

class Garage{
String garagename;
double height;
double width;
double depth;
}

public class CarVsGarage{
static final int FOR_TEST = 3;

public static void main (String[] args) throws IOException{
Car[] cars = new Car[FOR_TEST];
Garage[] garages = new Garage[FOR_TEST];

System.out.println("車の情報を入力してください。");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

for (int i = 0; i < cars.length; ++i){
cars[i] = new Car();

System.out.println(i+1 + "台目の車の名前を入力してください。");
String str1 = br.readLine();
System.out.println("車の高さを入力してください。");
String str2 = br.readLine();
System.out.println("車の幅を入力してください。");
String str3 = br.readLine();
System.out.println("車の長さを入力してください。");
String str4 = br.readLine();

double h1 = Double.parseDouble(str2);
double w1 = Double.parseDouble(str3);
double l1 = Double.parseDouble(str4);

cars[i].carname = str1;
cars[i].height = h1;
cars[i].width = w1;
cars[i].length =l1;
}

for (int i = 0; i < garages.length; ++i){
garages[i] = new Garage();

System.out.println((i + 1) + "つ目の車庫の名前を入力してください。");
String str5 = br.readLine();
System.out.println("車庫の高さを入力してください。");
String str6 = br.readLine();
System.out.println("車庫の幅を入力してください。");
String str7 = br.readLine();
System.out.println("車庫の長さを入力してください。");
String str8 = br.readLine();

double h2 = Double.parseDouble(str6);
double w2 = Double.parseDouble(str7);
double d2 = Double.parseDouble(str8);

garages[i].garagename = str5;
garages[i].height = h2;
garages[i].width = w2;
garages[i].depth = d2;
}

Random rand = new Random();
for (int i = 0; i < 10; ++i){
int car = rand.nextInt(cars.length);
int gar = rand.nextInt(garages.length);

compareCG(cars[car], garages[gar]);
}
}

static void compareCG(Car c, Garage g){
System.out.println(c.checkResult(g));
}
}

投稿日時 - 2007-12-17 14:42:34

お礼

御礼が遅くなってしまい、申し訳ありません。
回答ありがとうございます。
Java初心者なのでわからないところがいくつかありますが、理解できるように努力しようと思います。
ありがとうございました。
今後、また質問を出した際にはよろしくお願いします。

投稿日時 - 2007-12-23 06:48:28

ANo.1

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

hirox00さんへ
 bobvivさんのご指摘についてですが、クラスの設計や出力の設計は、業務目的次第です。業務要求を満たす、あるいは業務目的にとって便利な、クラスや出力を設計してください。ですから、私が即席で書いたものが、hirox00さんのねらいや顧客要求と違っていれば、もちろん自由に書き換えてください。

投稿日時 - 2007-12-24 11:04:52

お礼

わかりました。どうもありがとうございました。
これからもわからないことがたくさん出てくると思いますので、そのときにはまたよろしくお願いします。

投稿日時 - 2008-01-04 16:51:28

ANo.2

・要求されてもいないことを先走ってコードに書き込んでしまっている。
・物を収容することがその本質となっている車庫クラスよりも、どこかに収容されることがその本質だとはいい難い車クラスのほうがサイズ比較メソッドの在り処としてふさわしいと判断している。
・比較データを保存する際にご丁寧にもStringにして保存してしまい、doubleの値としての再利用を困難にしてしまっている。
・保存してある比較データを実質的に一回だけ読み出せるように作っておきながら、行った読み出しが有効な読み出しかどうかについて、特定のハードコードされた文字列が返るという形でしか判別することができないようになっている。 

投稿日時 - 2007-12-23 00:50:17

補足

ご回答ありがとうございます。
いくつかポイントをご指摘いただいているようなのですが、Javaをはじめたばかりなので、わからないことだらけです。勉強不足ですみません。
お手数でなければ、今の私でもわかるように書いていただけるとうれしいです。
お願いします。

投稿日時 - 2007-12-23 06:48:49

あなたにオススメの質問