Java if文を多様しないで組みたい
解決済
回答 8
投稿
- 評価
- クリップ 0
- VIEW 3,354

退会済みユーザー
現在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]);
}
}*/
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
public static void main(String[] args) throws Exception {
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();
int nameIndex = index(name, strx);
int testIndex = index(test, stry);
System.out.println("名前:" + strx);
System.out.println(stry + ":" + point[nameIndex][testIndex]);
}
private static int index(String[] array, String value) {
int index = -1;
for (int i = 0; i < array.length; i++) {
if (value.equals(array[i])) {
index = i;
break;
}
}
if (index == -1) {
throw new IllegalArgumentException(value);
}
return index;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
if文を一切使いたくないのですね、わかります。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.stream.IntStream;
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();
IntStream.range(0, name.length)
.filter(i -> strx.equals(name[i]))
.forEach(i -> {
System.out.println("名前:" + name[i]);
IntStream.range(0, test.length)
.filter(j -> stry.equals(test[j]))
.forEach(j -> {
System.out.println(test[j] + ":" + point[i][j]);
});
});
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
swordone さん、otftrough さんとあまり変わりませんが。。。
if 文の外側に for 文を書くことで、これまで配列に数字を直接指定していたところを、
i や j などの変数にして、繰り返し確認することが出来ます。
for(int i = 0; i < name.length; i++) {
if (strx.equals(name[i]) {
System.out.println("名前:" + name[i]);
for(int j = 0; j < test.length; j++) {
if (stry.equals(test[j])) {
System.out.println(test[j] + ":" + point[i][j]);
return;
}
}
}
}
動作未確認なので、参考までに・・・。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
各配列内でループで一致する要素を探せばいいでしょう。
int i = 0;
for(; i < name.length; i++){
if(strx.equals(name[i]))
break;
}
あるいは各配列をArrays.asListでList型に変換して、indexOfメソッドを使えばループも不要です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
swordoneさんのコードを使った例です。参考に。
int n = 0;
for(; n < name.length; n++){
if(strx.equals(name[n]))
break;
}
if(n < name.length){
System.out.println("名前:" + name[n]);
int t = 0;
for(; t < test.length; t++){
if(stry.equals(test[t]))
break;
}
if(t < test.length)
System.out.println(test[t] + ":" + point[n][t] + "点");
else
System.out.println("not found.");
} else
System.out.println("not found.");
動作確認済
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
すでに解決済みではありますが、、
ロジックが複雑になりすぎると感じたときは、そのロジックで扱っているデータの構造を見直してみることをお勧めします。
例えば、名前と点数を以下のような構造の2次元のMapオブジェクトに格納してやると、簡潔に書けます。
[
田中 => [
国語 => 100,
英語 => 80,
理科 => 50,
社会 => 30
],
加藤 => [
国語 => 30,
英語 => 40,
理科 => 70,
社会 => 90
],
...
]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
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 } };
// 変換後の名前と点数を格納する2次元Mapオブジェクト。
Map<String, Map<String, Integer>> scores = new HashMap<String, Map<String, Integer>>();
// データを変換するロジック。
for (int i = 0; i < name.length; i++) {
Map<String, Integer> score = new HashMap<String, Integer>();
for (int j = 0; j < test.length; j++) {
score.put(test[j], point[i][j]);
}
scores.put(name[i], score);
}
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(scores.get(strx).get(stry));
}
}
ただし、上のプログラムは、存在しない名前(例えば"鈴木"とか)を入力するとNullPointerException
で落ちます。
適切にNullチェックを入れてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Java、十数年ぶりに書いてみました。
コードを書いているうちに、他のいい回答が出てきちゃったので、解説とかはもういいかな、と。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Main {
protected class Student {
public String name;
public HashMap<String,Integer> points = new HashMap<String,Integer>();
public Student(String name) {
this.name = name;
}
}
protected HashMap<String,Student> students;
protected Main() {
this.students = new HashMap<String,Student>();
}
protected Main setup(String exams[]) {
for (String exam: exams) {
String ar[] = exam.split(" ", 0);
String studentName = ar[0];
for (String pair: ar[1].split(",", 0)) {
String val[] = pair.split(":", 0);
this.addPoint(studentName, val[0], Integer.parseInt(val[1]));
}
}
return this;
}
protected Main addPoint(String studentName, String subject, int point) {
Student student = this.students.get(studentName);
if (student == null) {
student = new Student(studentName);
this.students.put(studentName, student);
}
student.points.put(subject, point);
return this;
}
protected int get(String studentName, String subject) throws Exception {
Student student = this.students.get(studentName);
if (student == null) {
throw new Exception("「"+ studentName + "」ってゆー生徒はいねーよ"); // 適当に
}
Integer point = student.points.get(subject);
if (point == null) {
throw new Exception("「" + subject + "」なんちゅー教科はないぞよ"); // 適当に
}
return point;
}
protected static void test(Main m, String studentName, String subject) {
String message;
try {
message = "名前:" + studentName + ",教科:" + subject + "=" + m.get(studentName, subject);
} catch (Exception e) {
message = e.getMessage();
}
System.out.println(message);
}
public static void main(String[] args) throws IOException {
String exams[] = {
"田中 国語:100,英語:80,理科:50,社会:30",
"加藤 国語:30,英語:40,理科:70,社会:90",
"森田 国語:50,英語:90,理科:100,社会:0",
"北国 国語:0,英語:10,理科:70,社会:30"
};
Main m = new Main().setup(exams);
test(m, "田中", "国語");
test(m, "森田", "仏語");
test(m, "山下", "英語");
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
与えられたデータをそのままつかうより、処理がしやすいようなデータを構築すると良さそうです。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
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 } };
// 処理しやすくする為に連想配列を構築する
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (int n = 0; n < name.length; n++) {
for (int t = 0; t < test.length; t++) {
map.put(name[n] + " " + test[t], point[n][t]);
}
}
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(map.get(strx + " " + stry));
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
otftrough
2016/04/28 21:05
コードを書くときに、コード全体を「```java」と「```」で囲むと、より見やすくなります。