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

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

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

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

Q&A

解決済

3回答

3440閲覧

javaの標準入力された値をその後の入力された値と比べて結果を返すプログラムがうまく作れません。

uonitarou

総合スコア20

Java

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

0グッド

0クリップ

投稿2018/03/26 08:33

編集2018/03/26 09:33

前提・実現したいこと

標準入力にて以下のように
5 1
3
1 0
5 1
5 3

と言った形で入力した際に
はじめに入力された1行目の2つの数字5 1を軸に
それ以降の
1 0
5 1
5 2
と比較しもし1行目の左の5より小さい場合は負け 大きい場合はは勝ちと表示しさらに、5行目のように1つ目の数字がどちらも同じ場合2つ目の数字で同じよう比較して小さい場合負け 大きい場合勝ちと表示するプログラムを作成しております。

条件
1つ目と2つ目をどちらも同じ数値を入力することはできません。(例 1 1など)
1つ目と2つ目の数字が比較対象である1行目と全く同じ場合はエラーと表示します。(上の例ですと 5 1)

この場合ですと

1 0
負け
5 1
エラー
5 2
勝ち

と結果を返したいです。

因みに2行目の3は 比較するそれよりも下の行数です。今回が3個比較対象があるため3と入力されています。これを活用するべきなのでしょうが現状分からずremoveで削除しております。

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

考え方がそもそも間違っているようですが、ほかに思いつかないため強行して見ましたが、やはりうまく行きませんでした。ただ他のやり方が思い浮かばないためこの方法で行えるように試行錯誤している状況です。私の場合はListを使用しております。

該当のソースコード

未完成となりますが、

lang

1 List<String> list = new ArrayList<>(); 2 try(Scanner sc = new Scanner(System.in)) { 3 while(sc.hasNext()) { 4 list.add(sc.next()); 5 } 6 } 7 8 int a = Integer.parseInt(list.get(0)); 9 System.out.println(a); 10 11 int b = Integer.parseInt(list.get(1)); 12 System.out.println(b); 13 14 list.remove(0); 15 list.remove(0); 16 17 //数値 入力個数 18 int c = Integer.parseInt(list.get(2)); 19 20 //比べるのに不要部分 21 list.remove(0); 22 23 24 ArrayList<Integer> array = new ArrayList<Integer>(); 25 26 for(int i = 0; i < list.size(); i++) { 27 Integer value = Integer.parseInt(list.get(i)); 28 list.remove(i); 29 array.add(value); 30 }

となっており現状抱えている問題としては、比較していく3行目以降の数値をどのように1行目の数値と比較するかという部分です。

試したこと

現状では まず比較対象となる1行目を 1つ目の数値はa 2つ目の数値はbとして変数に格納し削除しております。
そして比較個数を一応cに格納し削除しております(現状使えておりません)

その後新しくIntegerリストを作りそこに比較していく3行目以降を格納しているのですが、これで結局どうやって比較を行い勝ち負け判定をするかという部分で完全にお手上げになってしまいました。

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

正直はじめから間違えている可能性が高いのでコードがガラリと変わってしまっても大丈夫なのでご教示いただけると助かります。

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

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

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

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

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

LouiS0616

2018/03/26 08:41

三行目以降入力される各『数字』は、必ず一桁なのでしょうか?具体的には、『10 3』みたいな入力もあり得るのですか?
uonitarou

2018/03/26 09:24

2桁まであり、さらにその数字にダブりはございません。こちらの説明不足で申し訳ありません。
guest

回答3

0

すごく泥臭いですが、こういうやり方もアリじゃないかと思います。

Java

1import java.util.*; 2 3class Main { 4 static int convertToInt(String src) { 5 String[] nums = src.split(" "); 6 // return 100 * Integer.parseInt(nums[0]) + Integer.parseInt(nums[1]); でも可 7 return Integer.parseInt( 8 String.format("%s%02d", nums[0], Integer.parseInt(nums[1])) 9 ); 10 } 11 12 public static void main(String[] args) { 13 try(Scanner sc = new Scanner(System.in)) { 14 int base = convertToInt(sc.nextLine()); 15 16 int len = Integer.parseInt(sc.nextLine()); 17 for(int i = 0; i < len; ++i) { 18 int input = convertToInt(sc.nextLine()); 19 if(base > input) { 20 System.out.println("負け"); 21 } 22 else if(base < input) { 23 System.out.println("勝ち"); 24 } 25 else { 26 System.out.println("エラー"); 27 } 28 } 29 } 30 } 31}

入力例

5 1 6 1 0 6 2 5 0 5 1 15 3 3 35

実行結果 Wandbox

負け 勝ち 負け エラー 勝ち 負け

投稿2018/03/26 09:36

編集2018/03/26 17:34
LouiS0616

総合スコア35660

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

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

uonitarou

2018/03/26 10:10

迅速なご回答ありがとうございます。splitで分けて〜といった所が私が最初に試し挫折したやり方に少し似ておりました。(笑)この書き方もどうやればうまくいくのか気になっていたのでとても勉強になります。 本当にありがとうございます。
guest

0

ベストアンサー

※回答ではありませんが、問題についていくつか質問したうえで回答したと思います。
1.すべてデータは1桁ですか?
2.入力で最初の数字2つと 後で比べる2つの数字がそれぞれ等しいときの判定はいらないですか?
(引き分けなど)
特に1番についてが知りたいです。
理由は、すべて1桁の時、スペースなしの入力で簡単なプログラムが作れるからです。

以上 よろしくお願いします。

<追記>
いくつか説明させてください。
1.入力の2行目で比較したいデータの個数を入力するのでListを使わなくても大丈夫です。
データを格納したい配列の要素数がわかるので(下のソースではn)その変数を使って宣言しましょう!
2.配列にそれぞれデータを格納することで 後は基本に沿ってif文で評価するだけで済みます。
3.最初の質問で「データはすべて1桁ですか?」と質問しましたが 
データがすべて1桁ですと もっと簡単にプログラムが書けるからです。
例えば 1 3と 入力したとき 1 3を 13と2桁の数字に置き換えることで、
簡単に比較ができます。

以上で説明を終わりたいと思います。
以下 ソースコードです。

Java

1import java.util.Scanner; 2 3public class Main { 4 5 public static void main(String[] args) { 6 7 Scanner sc = new Scanner(System.in); 8 String line = sc.nextLine(); 9 String []resultArray = line.split(" "); 10 int []sample = new int[2]; 11 String line2 = sc.nextLine(); 12 int n = Integer.parseInt(line2); 13 int [][]data = new int[n][2]; 14 int flag = 0; /*勝ったら1になる*/ 15 for(int i = 0; i < 2; i++){ 16 sample[i] = Integer.parseInt(resultArray[i]); 17 } 18 19 for(int i = 0; i < n; i++){ 20 String line3 = sc.nextLine(); 21 String []resultArray2 = line3.split(" "); 22 for(int j = 0; j < 2; j++){ 23 data[i][j] = Integer.parseInt(resultArray2[j]); 24 } 25 26 } 27 for(int i = 0; i < n; i++){ 28 flag = 0; 29 if(data[i][0] > sample[0]){ 30 flag = 1; 31 } 32 else if(data[i][0] == sample[0]){ 33 if(data[i][1] > sample[1]){ 34 flag = 1; 35 } 36 else if(data[i][1] == sample[1]){ 37 flag = 2; 38 } 39 else{ 40 flag = 0; 41 } 42 } 43 else{ 44 flag = 0; 45 } 46 switch (flag) { 47 case 0: 48 System.out.println(data[i][0] + " " + data[i][1] + ":負け"); 49 break; 50 case 1: 51 System.out.println(data[i][0] + " " + data[i][1] + ":勝ち"); 52 break; 53 default: 54 System.out.println(data[i][0] + " " + data[i][1] + ":エラー"); 55 break; 56 } 57 } 58 } 59 60 61}

投稿2018/03/26 09:17

編集2018/03/26 09:51
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

uonitarou

2018/03/26 09:24

書き忘れがあり申し訳ありませんでした。 1.すべてデータは1桁ですか? データは2桁までですので99までとなります。 2.入力で最初の数字2つと 後で比べる2つの数字がそれぞれ等しいときの判定はいらないですか? こちらのミスで同じ数字は入力できないようにする予定でした。そのため等しい場合がなくその判定が不要のようです。失礼しました。こちらに関して質問文章の修正をさせていただきます。
退会済みユーザー

退会済みユーザー

2018/03/26 09:34

分かりました。今からJavaでプログラムを構築いたしますので少々お待ちください。
退会済みユーザー

退会済みユーザー

2018/03/26 09:44

上記の回答の欄にソースコードを載せました。どこかわからないところ または エラーがありましたらまたご連絡ください。
uonitarou

2018/03/26 10:05

とても素早いご対応本当にありがとうございます。 コードは一度動かしてみて動きましたのであとは1行ずつ何を行ってるかを理解し改良して問題に取り組んでいこうと思います。(問題通りですと勉強にならないと思い数値の条件等を変えて質問させていただいておりましたので)私の頭では時間がかかると思いましたので先にお礼を書かせていただきました。 この度は本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/03/26 10:07

質問がありましたら いつでもどうぞ!!
uonitarou

2018/03/26 10:12

現在Javaを触り始めて1ヶ月ほどなのですが詰まることが多く、地道に少しずつ進めているのでとても心強いです。また今回のようなどうしてもわからない場合はこちらで質問させて頂くかもしれません。 よろしくお願い致します。
LouiS0616

2018/03/26 11:13

@Stars1024 さん ローカル変数が多いことが非常に気になります。ローカル変数はいわば『メモ』の働きをしますから、あまりに多いと本当に重要な情報が埋もれてしまうのです。 ローカル変数を減らすためには、メソッドチェーンやそれに準ずるもの(一時変数の積極的利用)、適切なサブルーチン化などが考えられます。 特にフラグを必要とする処理は、アーリーリターンを駆使すれば簡潔に書ける場合が多いです。 また、変数をスコープの頭でまとめて宣言するのも一般にはアンチパターンとして知られますので、避けておいた方が良いかと思います。 --- @uonitarou さん ひと月でここまで書けるのでしたら、いいペースで学習できていそうですね。 質問本文も非常に丁寧かつ的確でしたし、順調に伸びていきそうな気がします。頑張ってください。
退会済みユーザー

退会済みユーザー

2018/04/05 00:02

「変数をスコープの頭でまとめて宣言するのも一般にはアンチパターンとして知られます」について ある変数を使おうと考えたときその行に変数を宣言するという意味でしょうか?
LouiS0616

2018/04/05 04:35

新たな質問を拝見させていただきました。https://teratail.com/questions/120426 有益な回答が多くみられ、私自身非常に勉強になりました。 --- 変数をスコープ先頭で宣言『しなければならなかった』のはC99までです。 先頭で宣言しなくても良い以上、よりメリットが大きい方法を選ぶべきかと思います。 また『メモ』に例えてみます。 本にメモを貼る際、付箋を使ってどの箇所への言及かわかるようにしませんか? ページ数が少ないリーフレットならば、最初にまとめて貼った方が見通しがつくかもしれません。 しかし、ある程度ページ数が増えてくると、気にかけるべきことが増えすぎて、集中して本を読むことが出来ません。 --- 『スコープの広さ』と『ネストの深さ』はしばしば『精神的スタック』だと言われます。 これに注意することでコードは綺麗に、分かりやすく、デバッグしやすくなりますよ。
退会済みユーザー

退会済みユーザー

2018/04/05 04:45

回答ありがとうございます。私が最初に勉強したのはJavaではなくCだったので 先頭で宣言する癖がJavaにも響いたと思います。
LouiS0616

2018/04/05 04:58

学校というのは得てして専門外の教授がプログラミング言語の講義を持っていることもあり、情報が古かったり正確でなかったりしますので、それを補う調査は自力でする必要があります。 実は、『メソッドチェーン』とか『アーリーリターン』とか、意識して横文字を使ったコメントをしました。まずはとにかく調べてみてほしかったからです。 モダンなコードに積極的に触れてみてください。学ぶものがあるはずです。
guest

0

◇謝辞
LouiS0616さんの回答を参考にさせて頂きました。

以下は**※11 0←のような入力はないと仮定した回答です。**

  1. 区切り文字のスペースをreplace後にInteger.parseInt
  2. 判定はJudge関数を作成して比較はInteger.compareを使うように

Java

1import java.util.Scanner; 2 3public class A119051 { 4 5 public static void main(String[] args) { 6 try (Scanner sc = new Scanner(System.in)) { 7 int base = Integer.parseInt(sc.nextLine().replace(" ", "")); 8 int length = Integer.parseInt(sc.nextLine().replace(" ", "")); 9 for (int i = 0; i < length; ++i) { 10 int input = Integer.parseInt(sc.nextLine().replace(" ", "")); 11 Judge(base, input); 12 } 13 } 14 } 15 16 private static void Judge(int x, int y) { 17 int copareted = Integer.compare(x, y); 18 // Swinch文を使った判定 19// switch (copareted) { 20// case 0: 21// System.out.println("エラー"); 22// break; 23// case -1: 24// System.out.println("勝ち"); 25// break; 26// case 1: 27// System.out.println("負け"); 28// break; 29// } 30 // ◇Integer.compareのAPI仕様に合わせる形の判定 31 if (copareted == 0) { 32 // 最初に同じ値どうかを判定 33 System.out.println("エラー"); 34 } 35 if (copareted < 0) { 36 System.out.println("勝ち"); 37 } else { 38 System.out.println("負け"); 39 } 40 } 41} 42

投稿2018/03/26 19:48

編集2018/03/26 19:55
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問