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

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

新規登録して質問してみよう
ただいま回答率
85.35%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

Q&A

解決済

1回答

1194閲覧

Javaのプログラム分割について

retantaro

総合スコア15

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

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

0グッド

1クリップ

投稿2021/10/04 06:54

前提・実現したいこと

都道府県リストを作り、全データを出力するところまではできました。
ここに追加の機能として、
Scanner sc = new Scanner(System.in);
String line = sc.next();
で入力された県名を都道府県リストに格納されている県名と比較して、一致した県名のデータ(面積、人口、人口密度)を出力したいです。
また、プログラムは繰り返され、入力された県名が存在しなかった場合終了としたいです。
そこで、ここからMainクラスを作成し、計3つのクラスにした上で上記の処理を実装したいのですが、どうしたらいいか分からず詰まってしまいました。
実装例と解説を頂けると幸いです。
ご教授のほどよろしくお願いします。

該当のソースコード

Java

1// Prefクラス 2import java.nio.file.Path; 3import java.nio.file.Paths; 4import java.nio.file.Files; 5import java.util.List; 6import java.util.ArrayList; 7import java.io.IOException; 8import java.util.Scanner; 9 10public class Pref { 11 public static void main(String[] args) { 12 13 List<Prefecture> prefectures = new ArrayList<Prefecture>(); 14 15 try{ 16 // ファイル読み込み 17 Path readPath = Paths.get("revenge.txt"); 18 Scanner file = new Scanner(readPath); 19 //Scanner sc = new Scanner(System.in); 20 //String line = sc.next(); 21 22 while(file.hasNext()) { 23 final String str = file.nextLine(); 24 final String[] array = str.split(","); 25 26 if (array == null && array.length != 3) { 27 //エラー処理 28 System.out.println("データが存在しません"); 29 } 30 31 final String name = array[0]; 32 final double area = Double.parseDouble(array[1]); 33 final double population = Double.parseDouble(array[2]); 34 final Prefecture p = new Prefecture(name, area, population); 35 prefectures.add(p); 36 } 37 } 38 catch(IOException e) { 39 e.printStackTrace(); 40 } 41 42 // 出力する 43 for(Prefecture p:prefectures) { 44 System.out.println(p); 45 } 46 } 47} 48 49// Prefectureクラス 50public class Prefecture { 51 private String name; 52 private double area; 53 private double population; 54 55 public Prefecture(String name, double area, double population) { 56 this.name = name; 57 this.area = area; 58 this.population = population; 59 } 60 61 public final String getName() { 62 return name; 63 } 64 65 public final double getArea() { 66 return area; 67 } 68 69 public final double getPopulation() { 70 return population; 71 } 72 73 public final double getPopulationDensity() { 74 return area == 0 ? null:(double)population/area; 75 } 76 77 @Override 78 public String toString(){ 79 return getName() + ":"+ String.format("%.0f", getArea()) + ":"+ 80 String.format("%.0f", getPopulation()) + ":"+ String.format("%.0f", getPopulationDensity()); 81 } 82}

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

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

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

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

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

Zuishin

2021/10/04 07:10

このコードは誰が書いたんですか? これは設問の一部で、このコード以外を自分で書けという課題ではありませんか?
retantaro

2021/10/04 07:23

まだ初心者なもので段階的に作成していて、PrefクラスはMainクラスとして作成していたんですが、機能を追加するにはそれをPrefクラスに実装するのではなく新たにMainクラスを作って実装するというヒントをもらったのですが、そこでコードをどう改変するかで詰まってしまいました。 課題の設問は、 ファイル(revenge.txt)から県名、面積、人口、人口密度を読み込み、標準入力から県名を入力する。入力された県の面積、人口、人口密度を出力するプログラムを作成せよ。ただし、県名の入力と面積等の出力は、県名として存在しない県名が入力されるまで繰り返されるものとする。 です。
Zuishin

2021/10/04 07:29

> prefectures.add(p); これの代わりに、あるいはこれの前にその処理を入れれば良いと思います。 p.getName() で得られる県名が既存の県名リストに存在しなければループを中止すれば良いでしょう。 存在するならば toString() の書式を出力として指定されたフォーマットに合わせ、それを出力すればいいんじゃないですか?
retantaro

2021/10/04 07:50

ありがとうございます。 比較の処理はPrefクラスに実装するということでしょうか?
Zuishin

2021/10/04 07:54

それでいいと思います。
guest

回答1

0

ベストアンサー

クラスの分け方は言ってしまえば人それぞれですので、ヒントをくれた方がどういう意図でそのようなヒントにされたのかは、ご本人で無ければ分かりません。

java に限らず、プログラムを作る際は「塊」を意識して分けることになると思います。
ご質問の内容の場合、大きくは

  1. 入力に応じて出力するループ
  2. ファイル
  3. ファイルの個々のデータ

になると思います。

1 はまず 2 を作る。ループを開始し、ユーザからの入力を待ち、入力されたら 2 からデータを探して表示してループを続け、無ければループ終了(=プログラムも終了)。

2 は生成時にファイルを読んで 3 を複数作り内部にリストもしくはマップとして保存しておく。県名から 3 を探すメソッドを持ち、 それは該当データがあれば 3 を返し、無ければ null を返す。

3 は県名・面積・人口を保持し、人口密度も計算のうえで全データを表示するメソッドを持つ。

投稿2021/10/04 18:07

編集2021/10/04 19:26
jimbe

総合スコア13209

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

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

retantaro

2021/10/04 23:37

以後プログラムを組むときは意識するようにします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問