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

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

ただいまの
回答率

90.47%

  • Java

    14090questions

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

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

解決済

回答 8

投稿

  • 評価
  • クリップ 0
  • VIEW 2,040
退会済みユーザー

退会済みユーザー

現在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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otftrough

    2016/04/28 21:05

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

    キャンセル

回答 8

+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;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 14:25

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

    キャンセル

  • 2016/04/28 15:15

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

    キャンセル

  • 2016/04/28 15:43

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

    キャンセル

  • 2016/04/28 18:00

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

    キャンセル

+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;
      }

    }
  }
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 14:26

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

    キャンセル

0

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 14:23

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

    キャンセル

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.");


動作確認済

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 14:24

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

    キャンセル

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チェックを入れてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 14:28

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

    キャンセル

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, "山下", "英語");
   }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/28 15:45

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

    キャンセル

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で質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    csvの抽出条件について質問です

    csvファイルの読み込みにキーボード入力をした文字と一致するものを抽出させるプログラムをつくっています。 ただ読み込むだけならできるのですが、それに条件をつけると読み込めなくなりま

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 解決済

    メソッドを使ったプログラムを作りたいです

    前提・実現したいこと Javaのメソッドを使う問題を解いています。 問題は以下の通りです。 ↓ 好物を元に動物の名前と特徴を出力するプログラム  ・作成するクラス 

  • 解決済

    100になる直前の加算結果出力

    javaで開始値と終了値を入力してその間の偶数を加算していき、合計が100を超えたら「数値が100を超えたため、処理を中止します。」とメッセージを出し、かつ合計が100になる前の加

  • 受付中

    ENTER実行処理

    Enterキーを押して、次の処理に移るCUIを作りたいのですが、思うようにいきません。勇者の攻撃のあとと、HP、MP表示のあとEnter押すまで次の処理しないようにしたのですが、教

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

  • 解決済

    while文に、文字列の比較を使ってプログラムを続けるか続けないか決められるようにしたいです

    public static void main(String[] args) { String y="yes", n="no"; do{ 処理 System.ou

  • 解決済

    [Java]AllyNameをNameInputでも使えるようにしたい

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.In

同じタグがついた質問を見る

  • Java

    14090questions

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