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

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

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

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

Q&A

解決済

3回答

1189閲覧

javaの標準入力について

yuki8

総合スコア11

Java

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

0グッド

0クリップ

投稿2018/04/12 06:57

編集2018/04/12 08:24

このような

絵の具の色をいくつ作れるかのプログラムです。
上部分(4から)が必要な色と個数で下部分(2から)は所持している色と個数です。これを入力した際に目的の色をいくつ作れるかを表示するプログラムです。

例えば
n
iro kazu

条件
n < 100
kazu < 10000

入力例
2
ao 3
midori 3

4
ao 20
aka 2
midori 13
kiiro 1

と入力した際に

出力例
4

と表示したいのですが、最初と5行目に出てきている 1つの数字(おそらくその後の入力行数)が邪魔で
うまく変数に値を入れることができません
どのようにすればよいでしょうか? 入力例の入力行数は毎回変わるもとなります
例:
3
ao 3
aka 2
midori3
2
ao 1
midori1
など

java

1 String line1 = sc.nextLine(); 2 3 int n = Integer.parseInt(line1); 4 5 String [] resipi; 6 7 //初期値 8 resipi = new String[2]; 9 10 11 //入力個数まで 12 for(int i = 0; i < n; i++){ 13 String line2 = sc.nextLine(); 14 resipi = line2.split(" "); 15 }

こうすると最初の4つは取り出せました。

試したこと
読み込んだ行が数値か数値でないかを判断しループをすることを考えましたが、コードに起こせませんでした。

ご回答よろしくお願いします。

追記
上のプログラムの結果が4になるのは
青を20こ緑を13こ持っていて 青3 緑3ずつ使うと
青は足りても緑は4個目を作った時点で足りなくなるので 結果作れる個数は4となります。

現在のわからない部分として
値をそれぞれの配列に入れたあと比べる際にどのように比べて作れるかずを求めるかという部分がいまいち想像がつきません。要素番号も同じわけではないので単純な方法ではできませんし

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

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

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

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

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

coco_bauer

2018/04/12 07:40

splitした結果の配列の長さ(要素数)が1なら1つの値(数値)、2なら文字列(色)と整数(個数)のペア、と判断できるのではないですか
unz.hori

2018/04/12 07:42

resipiの型は何でしょうか?
yuki8

2018/04/12 07:43

判断部分に関しては色々方法があると思うのですが、問題は入力値を上と下で比べる方法(今の上の方法ではおそらく無理かと思います)がわからずコードが書けない状態です。
unz.hori

2018/04/12 07:48

入力値を全て取得できたとして、結果をどうしたいのかが良く分かりませんね。
yuki8

2018/04/12 07:50

目的の色をいくつ作れるかを表示するプログラムです。
unz.hori

2018/04/12 07:52

色名の後の数値は何を意味しますか?
yuki8

2018/04/12 07:54

ao 3 は色 個数 です
unz.hori

2018/04/12 07:57

例えばという例でみると必要な色にmidori, kiiroがあるのに結果が4になるのは何故ですか?
unz.hori

2018/04/12 07:59 編集

追記されているようですがやっぱり理解できないや。必要な色が赤と黄色があるのに作れる色が4になる...
yuki8

2018/04/12 07:59

逆でしたすみません
guest

回答3

0

宿題だとしたら、本当は回答者の方のヒントを元に試行錯誤して欲しいところです。
とりあえず私のコードを回答しておきます。(あくまで参考として理解してください。コピペはだめですよ)
※.エラー処理などは全く考慮していません。
※.コメント部分(System.out)は途中経過を出力したものでロジックに関係ありません。

Java

1package answer.of.taratail; 2 3import java.util.HashMap; 4import java.util.Scanner; 5 6public class ScannerTest2 { 7 8 public static void main(String[] args) { 9 10 // Scanner生成 11 Scanner sc = new Scanner(System.in); 12 13 // 必要色情報(key:色名、value:数) 14 HashMap<String, Integer> needColors = new HashMap<String, Integer>(); 15 // 所持色情報(key:色名、value:数) 16 HashMap<String, Integer> haveColors = new HashMap<String, Integer>(); 17 // 入力パラメータ分割用 18 String inputParam[]; 19 20 // 必要色数 21 String readLine = sc.nextLine(); 22 Integer needColorNum = Integer.parseInt(readLine); 23 24 // 必要色情報取得 25 for(int i = 0; i < needColorNum; i++){ 26 readLine = sc.nextLine(); 27 inputParam = readLine.split(" "); 28 String key = inputParam[0]; 29 Integer value = Integer.parseInt(inputParam[1]); 30 needColors.put(key, value); 31 } 32 33 // 所持色数 34 readLine = sc.nextLine(); 35 Integer haveColorNum = Integer.parseInt(readLine); 36 37 // 所持色情報取得 38 for(int i = 0; i < haveColorNum; i++){ 39 readLine = sc.nextLine(); 40 inputParam = readLine.split(" "); 41 haveColors.put(inputParam[0], Integer.parseInt(inputParam[1])); 42 } 43 44 // 作成可能な色数を計算 45 int minMakeColorNum = 0; 46 for(String key : haveColors.keySet()) { 47 needColorNum = needColors.get(key); 48// System.out.println("key:" + key + ", value:" + needColorNum); 49 if (needColorNum != null) { 50 // 色名が一致した場合のみ計算ロジックに入る 51// System.out.println("key:" + key + ", have:" + haveColors.get(key) + ", need:" + needColorNum); 52 int makeColorNum = haveColors.get(key) / needColorNum; 53 if (minMakeColorNum == 0) { 54 // 初期値のままであれば計算値を代入 55 minMakeColorNum = makeColorNum; 56 } 57// System.out.println("makeMinColorNum:" + makeColorNum); 58 if (minMakeColorNum > makeColorNum) { 59 // 最小値が作成可能な色数となるので代入 60 minMakeColorNum = makeColorNum; 61 } 62 } 63 } 64 65 System.out.println("作成可能な色数:" + minMakeColorNum); 66 } 67} 68

投稿2018/04/12 09:25

unz.hori

総合スコア1057

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

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

yuki8

2018/04/13 01:22

宿題ということは学校のでしょうか?試せることは全て試し自分の考えでは比較部分ができないので質問致しました。
unz.hori

2018/04/13 01:44

まぁ、まずはJavaの基本APIを調べるというか理解することでしょうね。だいたいこんなクラス、メソッドないかなぁってのはあるはずなので。他の回答者の方が"連想配列"というヒントをくださってるんで"Java 連想配列"とかでググるとかできることはまだまだあるはずですね。宿題かどうかというのは単にこういうQ&Aサイトに宿題の問題を載せて回答を得てそれをコピペして提出する輩がいるからの懸念です。
yuki8

2018/04/13 04:05

誰かに出された宿題というよりはサイトを見て出題された問題を解く勉強ですね。ご回答いただきありがとうございました。
guest

0

いろいろ気になることが多いのですが、とりあえず質問点だけ答えます。
同じことを二回書けばいいです。

Java

1int n = Integer.parseInt(sc.nextLine()); 2for(int i = 0; i < n; ++i) { 3 一行読み取り; 4} 5 6int m = Integer.parseInt(sc.nextLine()); 7for(int i = 0; i < m; ++m) { 8 一行読み取り; 9}

ループの挙動が分かっていれば、これで入力が捌けることは理解できるかと。


他に気になる点については、理解度が把握でき次第追記します。

投稿2018/04/12 07:45

LouiS0616

総合スコア35660

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

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

yuki8

2018/04/12 08:02

理解できました、そこに関しては難しく考えすぎていたようです。ありがとうございます。
LouiS0616

2018/04/12 08:04

ところで、この問題はどこかのサイトのものでしょうか? その場合は引用元を示した方が良いかと思います。
yuki8

2018/04/12 08:05

著作権の関係上問題の条件自体やコードをこちらで変えています。すみません
LouiS0616

2018/04/12 08:11

引用元を明記すれば認められる範囲かと思いますが、いかがでしょう。 『もしかしたら宿題なんじゃないか?』という疑念も振り払えますし。
yuki8

2018/04/12 08:17

赤字で書かれてるので無理かと思います。
LouiS0616

2018/04/12 08:55

引用の原本と経緯が分かりませんので、これ以上詳しい回答は差し控えさせていただきます。 最後にヒントだけ。連想配列で色とその本数を管理すると楽です。
yuki8

2018/04/13 01:24

内容はかなり変えて一部分のみなので著作権等には触れないよう意識しております。そのせいで辻づま合わない部分が出てきてますが。
guest

0

ベストアンサー

こんにちは,まず初めに

最初と5行目に出てきている 1つの数字(おそらくその後の入力行数)が邪魔で

うまく変数に値を入れることができません

邪魔ではありません。これらの数字がaoやmidoriなどのデータを格納する配列の要素数となり、
宣言の時 利用します。むしろなかったら難易度が上がるでしょう。

とりあえず、入力のところだけソースを書きました。
私は 色の名前のところとその数のところを別々に分けました。(Stringとint)
(ちゃんとデータが格納されたか確認するため最後文字出力しています。)

ただ、いざ問題を解こうとしたときに問題の意味が微妙にわからないところがあって解けません。

4

ao 3
aka 2
midori 3
kiiro 1
2
ao 20
midori 13
と入力した際に
出力例
4

なぜ,答えが4になるのかがわからなくて問題を解くにも解けません.
すみませんがもう少し詳しく説明していただけませんか?
よろしくお願いします。

<追記>
問題の意味が分かったので私か書いたソース(一番下にある)の説明をしたいと思います。

Java

1String []color = new String[n]; 2int []color_num = new int[n]; 3String []color2 = new String[m]; 4int []color2_num = new int[m];

上から順に必要な色の 名前・個数
所持している色の 名前・個数
となります。

Java

1for(int i = 0; i < n; i++){ 2 for(int j = 0; j < m; j++){ 3 if(color[i].equals(color2[j])){ 4 array.add(color2_num[j] / color_num[i]); 5 } 6 } 7} 8

これはn個の色の名前を一つずつ m個の所持している色と名称が同じかどうかチェックしています。
同じなら(例えば質問欄にあったaoにしましょう.)所持している個数(今回は20個)と
必要な個数(今回は3個)で20 / 3 = 6組できます。
この操作をfor文で全通りやります。それぞれの色が何組できるかListに格納しましょう。

Java

1Collections.sort(array);

これを使うとListに格納したデータを昇順にソートすることができます。
昇順にソートすると最小値が一番最初 つまり0番目に来ます。
この0番目を結果として表示すれば完了です!!

以上

私が書いたソースコードを載せます。

Java

1import java.util.Scanner; 2import java.util.ArrayList; 3import java.util.Collections; 4 5public class Main{ 6 public static void main(String[] args){ 7 8 Scanner sc = new Scanner(System.in); 9 String line = sc.nextLine(); 10 int n = Integer.parseInt(line); 11 String []color = new String[n]; 12 int []color_num = new int[n]; 13 for(int i = 0; i < n; i++){ 14 line = sc.nextLine(); 15 String []resultArray = line.split(" "); 16 color[i] = resultArray[0]; 17 color_num[i] = Integer.parseInt(resultArray[1]); 18 19 } 20 line = sc.nextLine(); 21 int m = Integer.parseInt(line); 22 String []color2 = new String[m]; 23 int []color2_num = new int[m]; 24 25 for(int i = 0; i < m ; i++){ 26 line = sc.nextLine(); 27 String []resultArray = line.split(" "); 28 color2[i] = resultArray[0]; 29 color2_num[i] = Integer.parseInt(resultArray[1]); 30 } 31 ArrayList<Integer> array = new ArrayList<>(); 32 for(int i = 0; i < n; i++){ 33 for(int j = 0; j < m; j++){ 34 if(color[i].equals(color2[j])){ 35 array.add(color2_num[j] / color_num[i]); 36 } 37 } 38 } 39 Collections.sort(array); 40 System.out.println(array.get(0)); 41 } 42}

投稿2018/04/12 07:44

編集2018/04/12 09:08
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki8

2018/04/12 07:57

追記をご確認ください。
yuki8

2018/04/12 08:07

理解できました。ありがとうございます。書けそうです。
yuki8

2018/04/12 08:20

比べる際の比べ方がわからなかったです。 例えば ao はaoで個数を比べて割った余りを返せばいいと思うんですが配列の要素番号も同じわけではないですし、特定文字があるか判定するためのArrays.asListでは無理ですよね?
退会済みユーザー

退会済みユーザー

2018/04/12 08:50

なるほど そういうことですね つまり ao 20 midori 13 を持っているに対して 必要なのは ao 3 midori 3 より 求める答えは 20/3と13/3の「最小値」の4ということになります。
退会済みユーザー

退会済みユーザー

2018/04/12 08:51

やるべきことが分かったので実際にソースコードを書きたいと思います。
yuki8

2018/04/13 04:04

ありがとうございます。無事動きました。
退会済みユーザー

退会済みユーザー

2018/04/13 06:21

今回のような データの個数・実際のデータ を入力するものは説明した通りの方法でできます。 今回はデータが2つで文字列 変数といった型の異なるものだったので分けましたが 型が同じなら2次配列でできます。その時もline.split("")で分けましょう。
yuki8

2018/04/16 08:28

ありがとうございます。もっと柔軟に考えてみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問