在String数组中获取数据的模块化计算器

时间:2016-01-05 20:42:33

标签: java

我目前遇到CodeAbbey的问题。我不想回答整个问题。

这是问题的关键:

  

输入数据将包含:

     
      
  • 第一行中的初始整数;
  •   
  • 描述操作的一行或多行,表格符号值,其中sign为+或*,value为整数;
  •   
  • 同一形式的最后一行,但改为使用符号%和结果应该除以得到余数的数字。
  •   
     

答案应该给出顺序应用的所有操作的结果的剩余部分(从初始数字开始)除以最后一个数字。

我的问题在于逻辑。到目前为止,我意识到有一个运算符,一个空格,然后是一个数字。要获得我想到的数字

char c = src.charAt(2);

并且让操作员使用同样的东西。然后我只是使用一堆if-else语句来弄清楚其余部分。但是我该如何大规模地做到这一点?我如何阅读所有这些数字并为其中的每一个执行此操作?对正确方向的推动会有所帮助。

import java.util.Scanner;

public class Challenge14 {

    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {

        System.out.println("Enter Your first number: ");
        int x = in.nextInt();

        for (int i = 0; i < 7; i++) {
            String[] s = new String[i];

            s = in.nextLine();
        }
    }
}

5 个答案:

答案 0 :(得分:4)

此问题的一个更有用的类是扫描仪。

Scanner文档位于: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

可以将扫描仪设置为从字符串,文件或输入流中读取。

扫描仪有几种有用的方法,包括:

  • hasNext(),它可以让您知道是否有其他运营商或号码可供选择
  • next(),它将下一个标记读作字符串
  • nextInt(),它将下一个标记读作int

您可以使用扫描仪获取第一个数字,然后使用某种循环对该数字执行操作,直到无法再执行操作为止。

答案 1 :(得分:2)

假设输入来自文件,您要做的是:

  • 以数字
  • 读取第一行
  • 在空格上拆分每一行的输入,这样你就可以解释为操作符,可以解释为数字
  • 执行操作并累积结果

文件部分很可能是您正在努力的方向。以下答案解决了这个问题。我将其余的作为练习留给读者。

public class Accumulator {
    private int result;

    public void readFile(String filename) {
        try(Scanner scan = new Scanner(new File(filename)) {
            // Unconditionally read the first line as a number
            result += Integer.parseInt(scan.nextLine());
            //Now, we need to read in each other line remaining.
            while(scan.hasNextLine()) {
                String[] contents = scan.nextLine().split();
                int number = Integer.parseInt(contents[1]);
                // The operator is in contents[0]
                performArithmeticWith(contents[0], number);
            }
        } catch(IOException e) {
            e.printStackTrace();
        }
   }

   public void performArithmeticWith(String operator, int number) {
       switch(operator) {
           case "+":
           break;
           // etc
       }
   }

} 

答案 2 :(得分:1)

输入数据在第一行包含一个数字。然后是每个连续行上的空格分隔的操作和数字。这是一种读取数据的方法。

首先,逐行读取数据,直到没有更多行。由于第一行只有一个元素,因此读取它并将其转换为整数(看起来所有数据都是整数)。可以使用Scanner逐行读取数据。这里有两个有用的方法:

public boolean hasNextLine() - Returns true if there is another line in the input of this scanner.
public String nextLine() - Advances this scanner past the current line and returns the input that was skipped.

对于之后的每一行,请阅读它,然后使用String[] splited = str.split("\\s+");根据空白区域将其拆分。然后处理字符串,并读取下一行。请注意,split默认情况下基于空格分割而"\\s+"仅用于显式。

答案 3 :(得分:1)

  

我的问题在于逻辑。到目前为止,我意识到有一个操作符,一个空格,然后是一个数字。

Java中有几个选项可以分隔运算符和操作数。

您可以使用String.split()方法:

String[] token input.split(" ");
//token[0] will be your operator
//token[1] will be your number

您还可以使用indexOf()方法:

int idx = input.indexOf(" ");
String opr = input.substring(0, idx);    //your operator
String num = input.substring(idx+1);     //your number

答案 4 :(得分:1)

这是我的方法。

  

假设您将所有值都作为String数组(其中   相信与制作可扩展的解决方案相比,我相信很容易。

这是我的代码。您可以轻松支持其他操作员,操作员顺序无关紧要。

package com.stack.overflow.test;

import java.math.BigDecimal;

public class Calculator {


    public static void main(String[] args) {
        String[] values = {"5", "+", "3", "*", "7", "+", "10", "*", "2", "*", "3", "+", "1", "%", "11"};
        new Calculator().calculate(values);
    }

    public void calculate(String[] inputs) {
        BigDecimal result = null;
        for(int i = 0; i < inputs.length-2;) {
            String left = inputs[i];
            String operator = inputs[++i];
            String right = inputs[++i];

            System.out.println("left : "+ left);
            System.out.println("operator : "+ operator);
            System.out.println("right : "+ right);

            result = Operator.instanceOf(operator).apply(new BigDecimal(left), new BigDecimal(right));
            inputs[i] = result.toString();
            System.out.println("Result :: "+ result);
        }

    }
}

enum Operator {
    ADD("+") {
        BigDecimal apply(BigDecimal left, BigDecimal right) {
            return left.add(right);
        }
    },
    MULTIPLY("*"){
        BigDecimal apply(BigDecimal left, BigDecimal right) {
            return left.multiply(right);
        }
    },
    REMAINDER("%"){
        BigDecimal apply(BigDecimal left, BigDecimal right) {
            return left.remainder(right);
        }
    };

    private String symbol;
    Operator(String symbol) {
        this.symbol = symbol;
    }

    public static Operator instanceOf(String givenSymbol) {
        for(Operator operator : Operator.values()) {
            if(operator.symbol.equals(givenSymbol)) {
                return operator;
            }
        } throw new RuntimeException("Operator not supported : "+givenSymbol);
    }

    abstract BigDecimal apply(BigDecimal left, BigDecimal right);
}
  

结果

left : 5
operator : +
right : 3
Result :: 8
left : 8
operator : *
right : 7
Result :: 56
left : 56
operator : +
right : 10
Result :: 66
left : 66
operator : *
right : 2
Result :: 132
left : 132
operator : *
right : 3
Result :: 396
left : 396
operator : +
right : 1
Result :: 397
left : 397
operator : %
right : 11
Result :: 1