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

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

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

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

Q&A

解決済

5回答

8618閲覧

くじの当選番号のプログラム

modonokouki

総合スコア26

Java

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

0グッド

0クリップ

投稿2016/02/15 04:23

手順
①当選番号を6つ入力する
②自分が買った券の枚数を入力
③自分が買った券の番号を入力(6つ)
④それぞれの自分の勝った券がどれくらいあたっているか出力

入力例
1 2 3 4 5 6
3
1 5 4 2 3 6
9 6 2 7 1 5
32 9 87 33 41 60
出力例
6
4
0

java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 7 String line = br.readLine(); 8 line = line.trim(); 9 String [] readLineArray = line.split(" ",7); 10 String N = br.readLine(); 11 int n = Integer.parseInt(N); 12 int [] roto = new int[n]; 13 String [] rereadLineArray = new String[n]; 14 for(int i=0;i<n;i++){ 15 String kouho = br.readLine(); 16 kouho = kouho.trim(); 17 rereadLineArray = kouho.split(" ",7); 18 for(int j=0;j<n;j++){ 19 for(int z=0;z<n;z++){ 20 if(readLineArray[z].equals(rereadLineArray[j])){ 21 roto[i] += 1; 22 } 23 } 24 } 25 } 26 for(int k=0;k<n;k++){ 27 System.out.println(roto[k]); 28 } 29 } 30}

多分ほとんどミスはないと思うのですが、for文のところで間違っている気が自分ではします
なので良かったらその点を訂正していただきたいのと、もしこれより綺麗なプログラミングがかけるとしたら興味本位で見てみたいなと思いました

よろしくお願いします!

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

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

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

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

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

guest

回答5

0

実行して結果を確認されましたか?
非常に残念です・

投稿2022/08/13 17:22

shatikuson

総合スコア4

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

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

0

細かい入力チェックと例外の処理は省きます。
Java8以上で動きます。
今からJavaを勉強するのであれば、最新のバージョンを使うのをおすすめします。

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.util.ArrayList; 4import java.util.Arrays; 5import java.util.List; 6import java.util.stream.Stream; 7 8public class Main { 9 public static void main(String[] args) throws Exception { 10 // 細かい入力チェックと例外の処理は省きます 11 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 12 // 当選番号 13 System.out.println("当選番号を入力してください"); 14 List<String> luckyNumbers = Arrays.asList(br.readLine().split(" ")); 15 16 // 購入枚数 17 System.out.println("購入枚数を入力してください"); 18 int buiedTicketNumber = Integer.parseInt(br.readLine()); 19 20 // 自分の番号 21 List<String[]> myNumbersList = new ArrayList<>(); 22 System.out.println("自分の番号を入力してください"); 23 for (int i = 0; i < buiedTicketNumber; i++) { 24 myNumbersList.add(br.readLine().split(" ")); 25 } 26 27 // 券ごとの当選数を表示 28 myNumbersList.stream().map(myNumbers -> { 29 return Stream.of(myNumbers).filter(luckyNumbers::contains).count(); 30 }).forEach(System.out::println); 31 } 32}

投稿2016/02/15 07:50

編集2016/02/15 07:53
root_jp

総合スコア4666

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

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

modonokouki

2016/02/15 09:14

ありがとうございます!おかげで出来ました! すみません、どうしてもわからない点が2店あるのですが、 ①LIST<String[]>と文字列の配列のreadLineArratとの違い ② myNumbersList.stream().map(myNumbers -> { return Stream.of(myNumbers).filter(luckyNumbers::contains).count(); }).forEach(System.out::println); が具体的にどのようなことをしているのか? (いまいちmapについて理解するのが出来ませんでした) ほんとうに迷惑なことだと思うのですが良かったら返信お願いします!
root_jp

2016/02/15 12:54 編集

①LIST<String>と文字列の配列との違い どちらでやろうが解決はできますが、今回はListのcontainsメソッドを使いたかったので、配列をListに変換しました。 list.contains(value) は、listの要素の中にvalueが存在するか否かのbooleanを返します。 ループして1つ1つ当選番号とマッチングしていくのではなく、 当選番号のリストの中に、自分のこの番号が含まれているか?という判断にしています。 含まれていれば、その番号は当選ということになりますね。 ② これらはJavaの8から導入された、Stream API と言って少し難しいです。 わざわざ使わなくても、地道にfor文でループすれば同じことができますので、 まだ覚える必要はないかと思いますが、2重3重の if や for は醜いですし、 こちらを使った方がシンプルになります。 この書き方はJavaだけの話ではなく、他の言語でも良く導入されている方法ですので、 将来的には理解すべきです。 というより、Javaがやっと他の言語に追いついたと言ってもいいぐらい やっとJavaに導入された機能ですね。 map は変換です。 今回の場合で言えば、例えば、List( String[], String[], String[] ) だった場合 (String[] は自分の番号、3つあるので3枚分入力された) List( 当選件数, 当選件数, 当選件数 ) に変換しているイメージですかね。 文字で説明するのは難しいです。。。すみません。 全体を通すと List( String[], String[], String[] )を順番に取り出して、 filterを使って当選番号だけの配列にしています。 String[1][20][3][40][5][50] が自分の番号だった場合 String[1][3][5] にしてるということです。 これにcountを使って、配列の要素数を取得しています。 String[1][3][5]は当選番号だけに絞られた後ですので、配列の要素数 = 当選数 になりますよね? これが3枚分行われ、最終的にList( 当選件数, 当選件数, 当選件数 ) になり あとは、forEachで順番に表示しています。
swordone

2016/02/15 14:29 編集

細かいですが、最後の行は次のようにしたほうがいいと思います。 myNumbersList.stream().mapToLong(myNumbers -> Stream.of(myNumbers).filter(luckyNumbers::contains).count() ).forEach(System.out::println); ただのmapだとオートボクシングされてしまうので。 mapメソッドについて少し説明を加えるなら、 「Streamから要素を取り出していき、その要素に対して引数に入っている関数を適用し、その結果を新たにStreamにする」というものです。やっぱり言葉での説明は難しいですね、これ。 今回の場合、「購入したくじ番号」のString[]を持つStreamから、String[]を取り出していきます。このString[]に対して、ある関数を適用します。その関数が"myNumbers ->"の次の部分です。取り出した要素をmyNumbersという変数として扱って、その後の処理を記述しています。 まずStream.of(myNumbers)でこれをStream化します。そしてfilterというメソッドで要素を絞り込みます。引数となっている関数に渡した結果がtrueになるもののみで構成される新たなStreamが作られます(今回の場合、当選番号luckyNumbersに含まれているかどうか)。そして最後にその残った要素数、つまり当選した番号の数をcountで数えます。 こうして、一つのString[]に対して、ある値が計算されました。これを、myNumbersListに入っているすべてのString[]に対して計算し、それぞれの結果を持った新たなStreamを作ります。 そうして、その結果をforEachで処理します。この引数の関数に渡して終了します。 この場合、おなじみのSystem.out.printlnに渡す、つまり標準出力に出力します。
guest

0

コメントだと分かりにくくなったので修正です。

あとsplitの第2引数ですが、0にした方がよさそうなので
0に変えます。
split 参考ページ

java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 7 8 //当選番号をセット 9 String tosenBango = br.readLine().trim(); 10 String[] tosenBangoArray = tosenBango.split(" ",0); 11 12 //購入数をセット 13 int kounyuSu = Integer.parseInt(br.readLine().trim()); 14 15 //購入数分ループする 16 for(int i=0; i<kounyuSu; i++){ 17 18 //当選数を初期化 19 int hitResult = 0; 20 21 //購入したくじの番号をセット 22 String kounyuKuji = br.readLine().trim(); 23 String[] kounyuKujiArray = = kouho.split(" ",0); 24 25 //購入したくじの当選判定 26 for(int j=0; j<kounyuKujiArray.length; j++){ 27 for(int z=0; z<tosenBangoArray.length; z++){ 28 if(kounyuKujiArray[j].equals(tosenBangoArray[z])){ 29 hitResult += 1; 30 } 31 } 32 } 33 34 // 結果出力 35 System.out.println(hitResult); 36 } 37 38 } 39}

投稿2016/02/15 07:17

hato_pato

総合スコア215

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

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

0

for(int k=0;k<n;k++){
System.out.println(roto[k]);
}

は不要かと。

System.out.println(roto[i]);

として

for(int j=0;j<n;j++){ for(int z=0;z<n;z++){ if(readLineArray[z].equals(rereadLineArray[j])){ roto[i] += 1; } } }

の直後にすれば良いと思います。

あとは、順番は問わない・同じ番号は指定できないなどの条件が
あるなら書いておいた方が良いです。

更にいうと、当選番号は当選番号と分かる変数にセットして
購入したくじは購入したくじのリストと分かるようにした方が読みやすいです。

投稿2016/02/15 05:13

hato_pato

総合スコア215

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

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

hato_pato

2016/02/15 05:27

ざっと、書き直してみました。 動かしても無いのと同じ番号が1くじ内にある場合、当選数は正しくなくなります。 あと入力値が数値じゃないとNGとか、その辺はチェックしていません。 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //当選番号をセット String tosenBango = br.readLine().trim(); String[] tosenBangoArray = tosenBango.split(" ",7); //購入数をセット int kounyuSu = Integer.parseInt(br.readLine().trim()); //購入数分ループする for(int i=0; i<kounyuSu; i++){ //当選数を初期化 int hitResult = 0; //購入したくじの番号をセット String kounyuKuji = br.readLine().trim(); String[] kounyuKujiArray = = kouho.split(" ",7); //購入したくじの当選判定 for(int j=0; j<kounyuKujiArray.length; j++){ for(int z=0; z<tosenBangoArray.length; z++){ if(kounyuKujiArray[j].equals(tosenBangoArray[z])){ hitResult += 1; } } } // 結果出力 System.out.println(hitResult); } } }
guest

0

ベストアンサー

ぱっと見分かるのは、

for(int j=0;j<n;j++){ for(int z=0;z<n;z++){ if(readLineArray[z].equals(rereadLineArray[j])){ roto[i] += 1; } } }

上記のforで使われているnは自分が買った券の枚数なので、当選番号が6つ判定されていません。(入力例だと3回)

ソースコードとして言うとすれば、少し変数の命名がわかりにくい(nとか何を指してるのかソースを読んでいかないと分からない)のでもう少し名前を気をつけてみてはどうでしょうか?
上記の件は変数の名前を適切に当てていれば間違えなかったものだと思います。

(readLineArrayも、hitNumbersとか。。。全体的に変数名がわかりにくいですね)

投稿2016/02/15 05:02

編集2016/02/15 05:07
fagai

総合スコア2158

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問