四則演算の処理において、演算子の文字列をキーとし、四則演算処理を行う関数を値としたHashMapを利用したプログラムとして作成したい。
四則演算の方法としては「逆ポーランド記法の四則演算」のようなプログラムにしたい。
プログラムは作りましたが、エラーが出てしまいます
java
1package prog2; 2import java.util.*; 3import java.util.function.*; 4public class CalculatorFunc { 5 HashMap<String,DoubleUnaryOperator> optable = new HashMap<> (); 6 void run() { 7 optable.put("+",(x,y) -> {return x+y;}); 8 optable.put("-",(x,y) -> {return x-y;}); 9 optable.put("*",(x,y) -> {return x*y;}); 10 optable.put("/",(x,y) -> {return x/y;}); 11 Scanner sc = new Scanner(System.in); 12 while(true) { 13 String [] input = sc.nextLine().split("[ ]+"); 14 if(input[0].equals("quit")) break; 15 List<String> exp = Arrays.asList(input); 16 double ans = calcFromPostExp(exp); 17 System.out.println(ans); 18 } 19 sc.close(); 20 } 21 double calcFromPostExp(List <String> postExp) { 22 LinkedList<Double> stack = new LinkedList<Double>(); 23 for(String st: postExp) { 24 System.out.println(stack); // デバッグ用 25 System.out.println(st); // デバッグ用 26 if(optable.containsKey(st)) { 27 // 演算の処理 28 double v2 =stack.pollFirst(); 29 double v1 =stack.pollFirst(); 30 double value = optable.get(st).applyAsDouble(value); 31 // スタックにプッシュする処理を下に書く 32 stack.push(value); 33 } else { 34 // それ以外は数字だと思う 35 double value = Double.parseDouble(st); 36 // スタックにプッシュする処理を下に書く 37 stack.push(value); 38 } 39 } 40 double ans =stack.pop(); 41 return ans; 42 } 43 public static void main(String[] args) { 44 new CalculatorFunc().run(); 45 } 46}
このような形で作ったのですが、以下の部分だけエラーが出てきます。どのように修正すれば良いでしょうか
java
1optable.put("+",(x,y) -> {return x+y;}); 2 optable.put("-",(x,y) -> {return x-y;}); 3 optable.put("*",(x,y) -> {return x*y;}); 4 optable.put("/",(x,y) -> {return x/y;});
エラーメッセージ
- Lambda expression's signature does not match the signature of the functional interface method applyAsDouble(double) - 型 HashMap<String,DoubleUnaryOperator> のメソッド put(String, DoubleUnaryOperator) は引数 (String, (<no type> x, <no type> y) -> {}) に適用できませ ん - 構文エラーがあります。";" を挿入して BlockStatements を完了してください - 構文エラーがあります。"AssignmentOperator Expression" を挿入して Assignment を完了してください
これは学校の課題でしょうか?
??の箇所を埋めてください、という質問となると「やってほしいことだけを記載した丸投げの質問」です。
ご自身で調査した結果、実際にプログラムを実行してみた結果が想定と異なる、という段階まで進めてから質問しましょう。
学校の課題であれば実装のヒントは授業中に出ているはずです。復習しましょう。
質問文を修正されましたが、そのコードでは山ほどコンパイルエラーが出てくると思います。
質問文に記載のエラーだけではないはずです。
(そのエラーメッセージは、コンパイルエラーがあるから実行できません、というエラーメッセージです)
記載するならコンパイル時のエラーを全文記載してください。
質問文のように、「とりあえず全部書いてみて(一度もテスト動作させずに)後から動かしてみよう」的なやり方だと、大量のコンパイルエラーに悩まされます。
やりたいことを1行書いて、1行ことにコンパイルして動作を確認する、という少しずつ実装をして細かくテスト実行してみることが重要です。
大抵のコンパイルエラーは、「何かがたりない」的なメッセージが出てくるのでエラーメッセージを読めばある程度理解が可能なはずです。
回答1件
あなたの回答
tips
プレビュー