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

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

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

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

Q&A

3回答

2940閲覧

JAVAに関する質問

qwerty123

総合スコア26

Java

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

0グッド

0クリップ

投稿2015/05/18 11:23

JAVAに関する質問です。
JAVAで以下のプログラムを作成しました。

import java.util.Scanner;

public class Sample {

//main
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);

int i = 0;

while(true) {
i++;

//数値を入力
System.out.print("入力 ");
int num1 = stdin.nextInt();

System.out.print("入力 ");
int num2 = stdin.nextInt();

int answer = 0; //計算結果

//1を入力したら加算、2を入力したら減算
System.out.print("1 or 2 ");
int number = stdin.nextInt();

switch(number) {

case 1:answer = add(num1,num2);
break;
case 2:answer = subtract(num1,num2);
break;

}

System.out.println("answer " + answer);
System.out.print("\n");
}

}

//加算
static int add(int num1,int num2) {

int x = num1 + num2;
return x;
}

//減算
static int subtract(int num1,int num2) {

int x = num1 - num2;
return x;
}

}

addメソッドとsubtractメソッドを作成し、1か2が入力されることにより加算または減算を行うプログラムを作成しました。
このプログラムのままで実行できるのですが、やや冗長に感じます。
どの部分を修正すればもっとさっぱりしたわかりやすいプログラムになるでしょうか。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

計算処理の種類の 1,2 の入力値による if 文を Map を使うことで除去したり、
足し算、引き算の処理をメソッドとして定義せずに ラムダ式として記述して簡潔に表示させるようにしてみました。
この様に書いておくと、+, - 以外の計算処理を追加するのが 比較的 楽になると思います。

lang

1import java.util.HashMap; 2import java.util.Scanner; 3 4public class Sample { 5 6 // 計算処理のインターフェース 7 @FunctionalInterface 8 private interface Operation { 9 public int calc(int v1, int v2); 10 } 11 12 // 足し算、引き算の計算処理を Map に登録。 13 static HashMap<Integer, Operation> Ope = new HashMap<Integer, Operation>() { 14 { 15 put(1, (int v1, int v2) -> {return v1 + v2;}); // 足し算 16 put(2, (int v1, int v2) -> {return v1 - v2;}); // 引き算 17 put(3, (int v1, int v2) -> {return v1 * v2;}); // 掛け算 18 } 19 }; 20 21 public static void main(String[] args) { 22 23 Scanner stdin = new Scanner(System.in); 24 25 while (true) { 26 // 数値を2つ入力 27 System.out.print("入力 その1: "); 28 final int num1 = stdin.nextInt(); 29 System.out.print("入力 その2: "); 30 final int num2 = stdin.nextInt(); 31 32 // 計算種類を入力 33 System.out.print("1 or 2 or -1 (1:足し算, 2:引き算, 3:掛け算, その他:終了"); 34 int number = stdin.nextInt(); 35 36 // 計算結果を表示 37 if (Ope.get(number) != null) { 38 System.out.println(Ope.get(number).calc(num1, num2)); 39 } else { 40 System.out.println("終了します。"); 41 break; 42 } 43 } 44 } 45}

投稿2015/05/18 13:30

編集2015/05/19 13:32
katoy

総合スコア22322

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

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

YuyaAizawa

2017/11/23 13:04

変数Ope(Javaなのでopeとした方が良い)はHashMapである積極的理由はないのでMap型で受けた方が良いと思います. またMapへの値のセットはdouble brace idiomを使うよりもMap.ofを使った方がエレガントです. さらに今回のラムダ式はbraceとreturnが省けます. あとは好みによるかもしれませんが,Operation extends BiFunction<Integer, Integer, Integer>でも良さそうです.
swordone

2017/11/23 14:10 編集

Map.ofはJava9の機能では? まあOperationは既存のIntBinaryOperatorが使えますが 上がってきたからコメントしてしまったけど質問番号が若くてよく見たら2年半前の質問…
YuyaAizawa

2017/11/23 14:12

おっと,投稿日を見ておりませんでした. 質問が上の方に表示されたのでてっきり最近のものかと. IntBinaryOperatorもおっしゃるとおりです.
guest

0

クラスを使ってやってみました。

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 7 System.out.println("加法 -> 1 減法 -> 2 を入力"); 8 int n = Integer.parseInt(sc.nextLine()); 9 10 int num1, num2; 11 System.out.println("2つの数字を入力"); 12 num1 = Integer.parseInt(sc.nextLine()); 13 num2 = Integer.parseInt(sc.nextLine()); 14 15 Calculation calc = new Calculation(num1,num2); 16 calc.print_answer(n); 17 System.out.println(); 18 } 19} 20 21class Calculation{ 22 private int MyNum1; 23 private int MyNum2; 24 25 public Calculation(int num1,int num2){ 26 MyNum1 = num1; 27 MyNum2 = num2; 28 } 29 30 public void print_answer(int n){ 31 n = n % 2; 32 if(n == 0){ 33 MyNum2 *= -1; 34 } 35 System.out.println(MyNum1 + MyNum2); 36 } 37}

投稿2018/05/19 07:47

編集2018/05/20 06:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/05/20 05:18

なんで低評価がつくのかがわからないです。(エラーはないはず)
umyu

2018/05/20 05:48 編集

>Stars1024さんへ マイナス付けた人ではないですがコードを見て気になった点を。 1,一番重要なのはクラス化しただけで、質問文の問題(将来乗算や割り算)が増えた時の問題を解決していない点だと思います。質問の内容と回答(クラス化した)を見比べて、解決したとStars1024さんが自信を持ってアピールできるポイントは何ですか? 2, 質問文のコードは入力のループがありますが、回答のコードは実装していない点 3,CalculationのcalcMethodでnew Calculation()する必要はなにかありますか? return thisを返せば良いのでは。
退会済みユーザー

退会済みユーザー

2018/05/20 05:54

乗算や割り算のところはクラスのところのint subtraction;の下に2つ変数を定義すれば (int multipy, int divide)わざわざ新たなメソッドを作る必要がないのがメリットではないかと思いました。(回答するとき乗算、割り算も入れようか迷ったけど蛇足になりそうでやめました。)
退会済みユーザー

退会済みユーザー

2018/05/20 05:55

加算も減算も先に両方計算してるから無駄があるってことでしょうね
退会済みユーザー

退会済みユーザー

2018/05/20 05:55

指摘されたところを参考にもっと短く書けるようにしてみます。
退会済みユーザー

退会済みユーザー

2018/05/20 05:57

>asahina1979さんへ 加算も減算も先に両方計算してるから無駄があるってことでしょうね について すみませんが、どういう意味なのか分かりません。
退会済みユーザー

退会済みユーザー

2018/05/20 06:09

これは「加算」「減算」だけですが 乗算・除算・余剰・公倍数・公約数... etc とふえていったら先に計算するのを増やしていくんですか?
退会済みユーザー

退会済みユーザー

2018/05/20 06:14

計算する以外の方法はあるのですか?
guest

0

せっかくなので回答も。
enumを使うという手もあります。

java

1import java.util.Arrays; 2import java.util.Scanner; 3import java.util.function.IntBinaryOperator; 4import java.util.stream.Collectors; 5 6public class Q10001 { 7 8 enum Operate implements IntBinaryOperator { 9 ADD("足し算", Integer::sum), 10 SUBTRUCT("引き算", (i1, i2) -> i1 - i2), 11 MULTIPLY("掛け算", (i1, i2) -> i1 * i2); 12 13 private String name; 14 private IntBinaryOperator op; 15 16 private Operate(String name, IntBinaryOperator operator) { 17 this.name = name; 18 op = operator; 19 } 20 21 @Override 22 public String toString() { 23 return ordinal() + ": " + name; 24 } 25 26 @Override 27 public int applyAsInt(int left, int right) { 28 // TODO 自動生成されたメソッド・スタブ 29 return op.applyAsInt(left, right); 30 } 31 } 32 33 public static void main(String[] args) { 34 Operate[] ops = Operate.values(); 35 String str = Arrays.stream(ops).map(String::valueOf).collect(Collectors.joining(", ", "", ", その他: 終了")); 36 37 try (Scanner stdin = new Scanner(System.in)){ 38 while (true) { 39 // 数値を2つ入力 40 System.out.print("入力 その1: "); 41 final int num1 = stdin.nextInt(); 42 System.out.print("入力 その2: "); 43 final int num2 = stdin.nextInt(); 44 45 // 計算種類を入力 46 System.out.print(str); 47 int number = stdin.nextInt(); 48 if (0 <= number && number < ops.length) { 49 System.out.println(ops[number].applyAsInt(num1, num2)); 50 } else { 51 System.out.println("終了します。"); 52 break; 53 } 54 55 } 56 } 57 } 58 59} 60

投稿2017/11/23 14:52

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問