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

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

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

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

Q&A

解決済

8回答

4341閲覧

Java if文を多様しないで組みたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2016/04/28 03:07

現在Javaにて名前と科目を入力したら登録した点数がでるプログラムを組んでいます。

エラーは無いのですがif文を多様してしまっているのでif文をあまり使わずに作りたいです。
アドバイスいただけるとありがたいです。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class test33 {

        public static void main(String[] args) throws IOException {

                String name[] = { "田中", "加藤", "森田", "北国" };
String test[] = { "国語", "英語", "理科", "社会" };

                int point[][] = { { 100, 80, 50, 30 }, { 30, 40, 70, 90 }, {
50, 90, 100, 0 }, { 0, 10, 70, 30 } };

                BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));

                System.out.println("名前を入力してください");
String strx = br.readLine();

                System.out.println("科目を入力してください");
String stry = br.readLine();

                System.out.println("名前:"+ name);
System.out.print(test);
System.out.print(point);

/*              if (strx.equals(name[0])) {
System.out.println("名前:" + name[0]);
if (stry.equals(test[0])) {
System.out.println(test[0] + ":" +
point[0][0]);
} else if (stry.equals(test[1])) {
System.out.println(test[1] + ":" +
point[0][1]);
} else if (stry.equals(test[2])) {
System.out.println(test[2] + ":" +
point[0][2]);
} else if (stry.equals(test[3])) {
System.out.println(test[3] + ":" +
point[0][3]);
}
}

                if (strx.equals(name[1])) {
System.out.println("名前:" + name[1]);
if (stry.equals(test[0])) {
System.out.println(test[0] + ":" +
point[1][0]);
} else if (stry.equals(test[1])) {
System.out.println(test[1] + ":" +
point[1][1]);
} else if (stry.equals(test[2])) {
System.out.println(test[2] + ":" +
point[1][2]);
} else if (stry.equals(test[3])) {
System.out.println(test[3] + ":" +
point[1][3]);
}
}

                if (strx.equals(name[2])) {
System.out.println("名前:" + name[2]);
if (stry.equals(test[0])) {
System.out.println(test[0] + ":" +
point[2][0]);
} else if (stry.equals(test[1])) {
System.out.println(test[1] + ":" +
point[2][1]);
} else if (stry.equals(test[2])) {
System.out.println(test[2] + ":" +
point[2][2]);
} else if (stry.equals(test[3])) {
System.out.println(test[3] + ":" +
point[2][3]);
}
}

                if (strx.equals(name[3])) {
System.out.println("名前:" + name[3]);
if (stry.equals(test[0])) {
System.out.println(test[0] + ":" +
point[3][0]);
} else if (stry.equals(test[1])) {
System.out.println(test[1] + ":" +
point[3][1]);
} else if (stry.equals(test[2])) {
System.out.println(test[2] + ":" +
point[3][2]);
} else if (stry.equals(test[3])) {
System.out.println(test[3] + ":" +
point[3][3]);
}
}*/
}

}

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

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

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

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

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

otftrough

2016/04/28 12:05

コードを書くときに、コード全体を「```java」と「```」で囲むと、より見やすくなります。
guest

回答8

0

if文を一切使いたくないのですね、わかります。

Java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.stream.IntStream; 5 6public class test33 { 7 public static void main(String[] args) throws IOException { 8 String name[] = { "田中", "加藤", "森田", "北国" }; 9 String test[] = { "国語", "英語", "理科", "社会" }; 10 11 int point[][] = { 12 { 100, 80, 50, 30 }, 13 { 30, 40, 70, 90 }, 14 { 50, 90, 100, 0 }, 15 { 0, 10, 70, 30 } }; 16 17 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 18 19 System.out.println("名前を入力してください"); 20 String strx = br.readLine(); 21 22 System.out.println("科目を入力してください"); 23 String stry = br.readLine(); 24 25 IntStream.range(0, name.length) 26 .filter(i -> strx.equals(name[i])) 27 .forEach(i -> { 28 System.out.println("名前:" + name[i]); 29 IntStream.range(0, test.length) 30 .filter(j -> stry.equals(test[j])) 31 .forEach(j -> { 32 System.out.println(test[j] + ":" + point[i][j]); 33 }); 34 }); 35 } 36}

投稿2016/04/28 10:02

raccy

総合スコア21735

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

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

0

java

1public static void main(String[] args) throws Exception { 2 3 String name[] = { "田中", "加藤", "森田", "北国" }; 4 String test[] = { "国語", "英語", "理科", "社会" }; 5 6 int point[][] = { { 100, 80, 50, 30 }, { 30, 40, 70, 90 }, { 50, 90, 100, 0 }, { 0, 10, 70, 30 } }; 7 8 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 9 10 System.out.println("名前を入力してください"); 11 String strx = br.readLine(); 12 13 System.out.println("科目を入力してください"); 14 String stry = br.readLine(); 15 16 int nameIndex = index(name, strx); 17 int testIndex = index(test, stry); 18 19 System.out.println("名前:" + strx); 20 System.out.println(stry + ":" + point[nameIndex][testIndex]); 21} 22 23private static int index(String[] array, String value) { 24 int index = -1; 25 for (int i = 0; i < array.length; i++) { 26 if (value.equals(array[i])) { 27 index = i; 28 break; 29 } 30 } 31 if (index == -1) { 32 throw new IllegalArgumentException(value); 33 } 34 35 return index; 36}

投稿2016/04/28 04:10

編集2016/04/28 04:15
root_jp

総合スコア4666

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 05:25

この方法は考えられなかったので実践してみます。ありがとうございます。
swordone

2016/04/28 06:15

indexという変数を使わずに、breakのところでreturn iすればもっと簡単になります。
退会済みユーザー

退会済みユーザー

2016/04/28 06:43

そうですね、あまり変数を増やすと自分でもごっちゃになることもあるのでその辺りは勉強しながら工夫できるようにしていきたいです。
root_jp

2016/04/28 09:00

IllegalArgumentException 投げたいので、そこで return していないだけですね。
guest

0

与えられたデータをそのままつかうより、処理がしやすいようなデータを構築すると良さそうです。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.HashMap; 5 6public class Test33 { 7 8 public static void main(String[] args) throws IOException { 9 10 String name[] = { "田中", "加藤", "森田", "北国" }; 11 String test[] = { "国語", "英語", "理科", "社会" }; 12 int point[][] = { { 100, 80, 50, 30 }, 13 { 30, 40, 70, 90 }, 14 { 50, 90, 100, 0 }, 15 { 0, 10, 70, 30 } }; 16 17 // 処理しやすくする為に連想配列を構築する 18 HashMap<String, Integer> map = new HashMap<String, Integer>(); 19 for (int n = 0; n < name.length; n++) { 20 for (int t = 0; t < test.length; t++) { 21 map.put(name[n] + " " + test[t], point[n][t]); 22 } 23 } 24 25 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 26 27 System.out.println("名前を入力してください"); 28 String strx = br.readLine(); 29 System.out.println("科目を入力してください"); 30 String stry = br.readLine(); 31 32 System.out.println(map.get(strx + " " + stry)); 33 } 34}

投稿2016/04/28 15:06

katoy

総合スコア22324

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

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

0

Java、十数年ぶりに書いてみました。
コードを書いているうちに、他のいい回答が出てきちゃったので、解説とかはもういいかな、と。

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.HashMap; 5 6public class Main { 7 protected class Student { 8 public String name; 9 public HashMap<String,Integer> points = new HashMap<String,Integer>(); 10 public Student(String name) { 11 this.name = name; 12 } 13 } 14 protected HashMap<String,Student> students; 15 16 protected Main() { 17 this.students = new HashMap<String,Student>(); 18 } 19 20 protected Main setup(String exams[]) { 21 for (String exam: exams) { 22 String ar[] = exam.split(" ", 0); 23 String studentName = ar[0]; 24 for (String pair: ar[1].split(",", 0)) { 25 String val[] = pair.split(":", 0); 26 this.addPoint(studentName, val[0], Integer.parseInt(val[1])); 27 } 28 } 29 return this; 30 } 31 32 protected Main addPoint(String studentName, String subject, int point) { 33 Student student = this.students.get(studentName); 34 if (student == null) { 35 student = new Student(studentName); 36 this.students.put(studentName, student); 37 } 38 student.points.put(subject, point); 39 return this; 40 } 41 protected int get(String studentName, String subject) throws Exception { 42 Student student = this.students.get(studentName); 43 if (student == null) { 44 throw new Exception("「"+ studentName + "」ってゆー生徒はいねーよ"); // 適当に 45 } 46 Integer point = student.points.get(subject); 47 if (point == null) { 48 throw new Exception("「" + subject + "」なんちゅー教科はないぞよ"); // 適当に 49 } 50 return point; 51 } 52 53 protected static void test(Main m, String studentName, String subject) { 54 String message; 55 try { 56 message = "名前:" + studentName + ",教科:" + subject + "=" + m.get(studentName, subject); 57 } catch (Exception e) { 58 message = e.getMessage(); 59 } 60 System.out.println(message); 61 } 62 public static void main(String[] args) throws IOException { 63 String exams[] = { 64 "田中 国語:100,英語:80,理科:50,社会:30", 65 "加藤 国語:30,英語:40,理科:70,社会:90", 66 "森田 国語:50,英語:90,理科:100,社会:0", 67 "北国 国語:0,英語:10,理科:70,社会:30" 68 }; 69 Main m = new Main().setup(exams); 70 test(m, "田中", "国語"); 71 test(m, "森田", "仏語"); 72 test(m, "山下", "英語"); 73 } 74}

投稿2016/04/28 06:31

unau

総合スコア2468

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 06:45

ありがとうございます。 動作確認はしてますが、配列要素以外を打ち込まれた場合の対策はしてなかったので、参考にさせていただきます。
guest

0

すでに解決済みではありますが、、

ロジックが複雑になりすぎると感じたときは、そのロジックで扱っているデータの構造を見直してみることをお勧めします。

例えば、名前と点数を以下のような構造の2次元のMapオブジェクトに格納してやると、簡潔に書けます。

[ 田中 => [ 国語 => 100, 英語 => 80, 理科 => 50, 社会 => 30 ], 加藤 => [ 国語 => 30, 英語 => 40, 理科 => 70, 社会 => 90 ], ... ]

java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.HashMap; 5import java.util.Map; 6 7public class test33 { 8 9 public static void main(String[] args) throws IOException { 10 11 String name[] = { "田中", "加藤", "森田", "北国" }; 12 String test[] = { "国語", "英語", "理科", "社会" }; 13 14 int point[][] = { { 100, 80, 50, 30 }, { 30, 40, 70, 90 }, { 50, 90, 100, 0 }, 15 { 0, 10, 70, 30 } }; 16 17 // 変換後の名前と点数を格納する2次元Mapオブジェクト。 18 Map<String, Map<String, Integer>> scores = new HashMap<String, Map<String, Integer>>(); 19 20 // データを変換するロジック。 21 for (int i = 0; i < name.length; i++) { 22 Map<String, Integer> score = new HashMap<String, Integer>(); 23 for (int j = 0; j < test.length; j++) { 24 score.put(test[j], point[i][j]); 25 } 26 scores.put(name[i], score); 27 } 28 29 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 30 31 System.out.println("名前を入力してください"); 32 String strx = br.readLine(); 33 34 System.out.println("科目を入力してください"); 35 String stry = br.readLine(); 36 37 System.out.println(scores.get(strx).get(stry)); 38 } 39}

ただし、上のプログラムは、存在しない名前(例えば"鈴木"とか)を入力するとNullPointerExceptionで落ちます。
適切にNullチェックを入れてください。

投稿2016/04/28 05:23

KiyoshiMotoki

総合スコア4791

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 05:28

回答ありがとうございます。 次はマップデータで同じものを作る予定でしたので詰まったときに参考にさせていただきます。
guest

0

ベストアンサー

swordone さん、otftrough さんとあまり変わりませんが。。。

if 文の外側に for 文を書くことで、これまで配列に数字を直接指定していたところを、
i や j などの変数にして、繰り返し確認することが出来ます。

Java

1 2for(int i = 0; i < name.length; i++) { 3 4 if (strx.equals(name[i]) { 5 System.out.println("名前:" + name[i]); 6 7 for(int j = 0; j < test.length; j++) { 8 9 if (stry.equals(test[j])) { 10 System.out.println(test[j] + ":" + point[i][j]); 11 return; 12 } 13 14 } 15 } 16}

動作未確認なので、参考までに・・・。

投稿2016/04/28 04:11

m.h

総合スコア149

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 05:26

自分が考えていたのと似ていて分かりやすかったためベストにしました、ありがとうございます。
guest

0

swordoneさんのコードを使った例です。参考に。

java

1int n = 0; 2for(; n < name.length; n++){ 3 if(strx.equals(name[n])) 4 break; 5} 6 7if(n < name.length){ 8 9 System.out.println("名前:" + name[n]); 10 int t = 0; 11 for(; t < test.length; t++){ 12 if(stry.equals(test[t])) 13 break; 14 } 15 16 if(t < test.length) 17 System.out.println(test[t] + ":" + point[n][t] + "点"); 18 else 19 System.out.println("not found."); 20 21} else 22 System.out.println("not found.");

動作確認済

投稿2016/04/28 03:52

otftrough

総合スコア476

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 05:24

具体的にソースまで書いていただきありがとうございます。
guest

0

各配列内でループで一致する要素を探せばいいでしょう。

java

1int i = 0; 2for(; i < name.length; i++){ 3 if(strx.equals(name[i])) 4 break; 5}

あるいは各配列をArrays.asListでList型に変換して、indexOfメソッドを使えばループも不要です。

投稿2016/04/28 03:12

編集2016/04/28 03:17
swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2016/04/28 05:23

ありがとうございます。 ループ処理で行ったら簡単にできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問