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

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

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

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

Q&A

解決済

3回答

316閲覧

データから最年長を表示したい

JAVA-B1

総合スコア4

Java

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

0グッド

0クリップ

投稿2023/05/25 07:34

編集2023/05/31 08:55

実現したいこと

指定したデータから最年長を出力するプログラムを作成したい

前提

・生年月日を考慮した出力結果にしたい
・CSV形式で出力する

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

エラーメッセージ

Java

class Quiz8 { public static void main(String[] args){ String[][] senbatsu = { {"Name","BloodType","Year","Month","Day","HomeTown"}, {"A","O","1992","11","21","Oita"}, {"B","B","1991","7","15","Kagoshima"}, {"C","AB","1994","3","26","Saitama"}, {"D","AB","1991","4","8","Tokyo"}, {"E","B","1997","3","8","Aichi"}, {"F","B","1993","7","14","Osaka"}, {"G","A","1998","3","19","Kagoshima"}, {"H","O","1990","8","13","Tokyo"}, {"I","A","1994","3","30","Saitama"}, {"J","B","1992","12","8","Kyoto"}, {"K","A","1991","6","24","Aichi"}, {"L","B","1993","9","19","Nara"}, {"M","O","1990","1","17","Saitama"}, {"N","B","1991","11","29","Aichi"}, {"O","B","1993","4","1","Aichi"}, {"P","B","1994","11","25","Tokyo"} }; int i,j; int maxy = Integer.parseInt(senbatsu[1][2]);//1列目 int maxm = Integer.parseInt(senbatsu[1][3]);//2列目 int maxd = Integer.parseInt(senbatsu[1][4]);//3列目 int maxi = 1; int y,m,d; for(i=2; i<senbatsu.length; i++){//1行目がタイトル行のため、2行からカウントしていく y = Integer.parseInt(senbatsu[i][2]);//年の行 m = Integer.parseInt(senbatsu[i][3]);//月の行 d = Integer.parseInt(senbatsu[i][4]);//日の行 int maxY = Integer.parseInt(senbatsu[maxi][2]);//年を比較した時、大きい値を記録 int maxM = Integer.parseInt(senbatsu[maxi][3]);//月を比較した時、大きい値を記録 int maxD = Integer.parseInt(senbatsu[maxi][4]);//日を比較した時、大きい値を記録 if (y<maxY || (y==maxY && m<maxM) || (y==maxY && m==maxM && d<maxD)) { maxi = i; //指定した年数<年の最大値 かつ (指定した年=最大値 かつ 指定した月<月の最大値) かつ (指定した年=最大値 または 指定した月=最大値 または指定した月<最大値)) //各最大値は、maxiに記録 } } System.out.print(senbatsu[maxi][0]); for(j=1; j<senbatsu[maxi].length; j++){ System.out.print( ", "+senbatsu[maxi][j] ); } System.out.println(""); } }

試したこと

みな様から頂いたアドバイスをもとに、プログラムを修正しました。
ありがとうございます!

上記プログラムで、一応、正しく実行できる様子です。
しかし、私自信が、正しく構文を理解できているのか自信がありません。

各行ごとにコメントで行の意味を記載しました。
間違って理解している箇所がありましたら、ご指摘いただけないでしょうか?
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

上記プログラムを実行した場合、
実行結果が↓のになるように作成したいと考えています。

M, O, 1990, 1, 17, Saitama

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

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

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

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

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

jimbe

2023/05/25 19:11 編集

>表計算(集計)機能 とは? if で使われている変数が何なのか、定義もありません。 if で何と何と比較しようというのでしょうか。 if 比較した結果、何の変数にどんな値を設定するつもりなのでしょう。
xebme

2023/05/25 21:17

y,m,dに分けると判定が難しいですね int ymd = y*10000 + m*100 + d なら簡単になりませんか
xebme

2023/05/25 21:46

if ブロックの処理わからないのなら maxy,maxm,maxdはそのときの最小の生年月日 (更新が必要) 最後にmaxiを得たい (更新が必要)
guest

回答3

0

ベストアンサー

maxiはその時点の最年長の行を記録しておく変数です。senbatsu配列を1行ずつ見ていって、今見ている行の生年月日とmaxiに記録されている行の生年月日を比較します。このとき今見ている行の生年月日のほうが古い場合は、今見ている行が現時点での最年長ですから、maxi変数を今見ている行番号で更新します。senbatsu配列のすべての行を見終わった際には、maxi変数にはsenbatsu配列の最年長の行が記録されているので、これをコンソールに表示すればよいです。

生年月日の比較方法ですが、java.util.Dateやjava.util.CalendarあるいはDate and Time APIなど、日時を扱う標準ライブラリを使うことが一般的ですが、それらを利用しない方法もあります。以下はその例です。

java

1int maxi = 1; 2for (int i = 2; i < senbatsu.length; i++) { 3 int y = Integer.parseInt(senbatsu[i][2]); 4 int m = Integer.parseInt(senbatsu[i][3]); 5 int d = Integer.parseInt(senbatsu[i][4]); 6 int maxY = Integer.parseInt(senbatsu[maxi][2]); 7 int maxM = Integer.parseInt(senbatsu[maxi][3]); 8 int maxD = Integer.parseInt(senbatsu[maxi][4]); 9 if (y<maxY || (y==maxY && m<maxM) || (y==maxY && m==maxM && d<maxD)) { 10 maxi = i; 11 } 12}

ちなみに現代的なJavaでは、同じことを以下のように実装することもできます。

java

1Arrays.stream(senbatsu) 2 .skip(1) 3 .min(Comparator.comparing(row -> LocalDate.of(Integer.parseInt(row[2]), Integer.parseInt(row[3]), Integer.parseInt(row[4])))) 4 .ifPresent(row -> System.out.println(String.join(",", row)));

投稿2023/05/25 13:52

neko_the_shadow

総合スコア2230

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

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

JAVA-B1

2023/06/01 16:48

アドバイスいただいた内容で、 無事、解決することができました。 ありがとうございます。
guest

0

考え方だけ書いてみます。

まずは年(maxyとy)を比較した場合、下記3パターンが考えられます。
(1)maxy < y の場合
(2)maxy = y の場合
(3)maxy > y の場合

(1)に合致する場合、今のループで見ているデータが最年長であることはあり得ません。maxy、maxm、maxdはそのままにしておき、次のデータと比較しましょう。
(2)に合致する場合、次は月(maxmとm)を比較する必要があります。
(3)に合致する場合、今のループで見ているデータが暫定で最年長です。maxy、maxm、maxdを更新して、次のデータと比較しましょう。

月と日の比較の仕方についても、同様に考えてみてください。

最年長のデータを探すということは、すべてのデータを見る必要があります。(データ数分forループを回す必要があり、途中でbreakしません)
「暫定で最年長のデータは配列の何番目なのか」の情報も持っていないと最後に出力できないのでご注意ください。

※ちなみに、特に理由がないのであればDate型に変換してcompareTo で比較した方が楽です。

投稿2023/05/25 12:41

ho-ta-te

総合スコア112

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

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

0

これでいい?

Java

1class test { 2 public static void main(String[] args){ 3 String[][] senbatsu = new String[][] { 4 new String[] {"Name","BloodType","Year","Month","Day","HomeTown"}, 5 new String[] {"A", "O", "1992", "11", "21", "Oita" }, 6 new String[] {"B", "B", "1991", "7", "15", "Kagoshima"}, 7 new String[] {"C", "AB", "1994", "3", "26", "Saitama" }, 8 new String[] {"D", "AB", "1991", "4", "8", "Tokyo" }, 9 new String[] {"E", "B", "1997", "3", "8", "Aichi" }, 10 new String[] {"F", "B", "1993", "7", "14", "Osaka" }, 11 new String[] {"G", "A", "1998", "3", "19", "Kagoshima"}, 12 new String[] {"H", "O", "1990", "8", "13", "Tokyo" }, 13 new String[] {"I", "A", "1994", "3", "30", "Saitama" }, 14 new String[] {"J", "B", "1992", "12", "8", "Kyoto" }, 15 new String[] {"K", "A", "1991", "6", "24", "Aichi" }, 16 new String[] {"L", "B", "1993", "9", "19", "Nara" }, 17 new String[] {"M", "O", "1990", "1", "17", "Saitama" }, 18 new String[] {"N", "B", "1991", "11", "29", "Aichi" }, 19 new String[] {"O", "B", "1993", "4", "1", "Aichi" }, 20 new String[] {"P", "B", "1994", "11", "25", "Tokyo" } 21 }; 22 23 java.util.Calendar cal = java.util.Calendar.getInstance(); 24 java.util.Date maxDate = null; 25 int maxi = 1; 26 for ( int i = 1; i < senbatsu.length; ++i ) { 27 cal.set( 28 Integer.parseInt(senbatsu[i][2]), 29 Integer.parseInt(senbatsu[i][3]), 30 Integer.parseInt(senbatsu[i][4]), 31 0, 0 ); 32 java.util.Date date = cal.getTime(); 33 if ( i == 1 || maxDate.before(date) ) { 34 maxDate = date; 35 maxi = i; 36 } 37 } 38 39 for( int i = 0; i < senbatsu[maxi].length; ++i ) { 40 System.out.print( (i == 0 ? "":", ") + senbatsu[maxi][i] ); 41 } 42 System.out.println(); 43 } 44}

投稿2023/05/25 12:07

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問