Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在字符串数组中获取数据的模块化计算器_Java - Fatal编程技术网

Java 在字符串数组中获取数据的模块化计算器

Java 在字符串数组中获取数据的模块化计算器,java,Java,我现在被一个来自的问题困住了。我不想知道整件事的答案 这是问题的核心: 输入数据将具有: 第一行中的初始整数 描述操作的一行或多行,形式为符号值,其中符号为+或*且值为整数 最后一行的形式相同,但使用符号%和数字代替,结果应除以该数字得到余数 答案应给出顺序应用的所有操作结果(从初始数字开始)除以最后一个数字的剩余部分 我的问题在于逻辑。到目前为止,我意识到有一个操作符,一个空格,然后是一个数字。得到我想用的号码 char c = src.charAt(2); 为了找到接线员,我会用同样的

我现在被一个来自的问题困住了。我不想知道整件事的答案

这是问题的核心:

输入数据将具有:

  • 第一行中的初始整数
  • 描述操作的一行或多行,形式为符号值,其中符号为+或*且值为整数
  • 最后一行的形式相同,但使用符号%和数字代替,结果应除以该数字得到余数
答案应给出顺序应用的所有操作结果(从初始数字开始)除以最后一个数字的剩余部分

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

char c = src.charAt(2);
为了找到接线员,我会用同样的东西。然后我会用一堆if-else语句来计算其余的。但我如何大规模地做到这一点呢?我该如何读入所有这些数字,并对每一个数字都这样做?朝正确的方向轻推会有所帮助


import java.util.Scanner;
公开课挑战14{
静态扫描仪输入=新扫描仪(系统输入);
公共静态void main(字符串[]args){
System.out.println(“输入您的第一个号码:”);
int x=in.nextInt();
对于(int i=0;i<7;i++){
字符串[]s=新字符串[i];
s=in.nextLine();
}
}
}

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

  • 把第一行读作数字
  • 在空白处将输入拆分为每行,这样就剩下了可以解释为运算符的内容和可以解释为数字的内容
  • 执行操作并累积结果
文件部分可能是您正在努力解决的问题。下面的答案说明了这一点。我把剩下的留给读者做练习

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

} 

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

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

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+”
只是为了明确起见

扫描器是解决这个问题的一个更有用的类

扫描仪文档位于:

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

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

  • hasNext(),它让您知道是否有其他运算符或数字可供选择
  • next(),它将下一个标记作为字符串读取
  • nextInt(),它将下一个标记作为int读取
您可以使用扫描仪拾取第一个数字,然后使用某种循环对该数字执行操作,直到没有其他操作可执行为止

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

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

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

String[] token input.split(" ");
//token[0] will be your operator
//token[1] will be your number
int idx = input.indexOf(" ");
String opr = input.substring(0, idx);    //your operator
String num = input.substring(idx+1);     //your number
您还可以使用
indexOf()
方法:

String[] token input.split(" ");
//token[0] will be your operator
//token[1] will be your number
int idx = input.indexOf(" ");
String opr = input.substring(0, idx);    //your operator
String num = input.substring(idx+1);     //your number
这是我的方法

假设您将以字符串数组的形式获取所有值(其中 我相信这比制定可扩展的解决方案要容易得多)

这是我的密码。您可以轻松地支持其他运算符,并且运算符的顺序无关紧要

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

你说的大规模是什么意思?您应该为一组运算和数字求解它,然后对每一行重复它。那么
Integer.parseInt
Scanner
对象呢?你可能想在空格上分开,而不仅仅是一个空格字符。是的,这就是我的意思。对于这个问题,我想把所有给定的行放在一个字符串中,然后逐个提取运算符和数字。但当我尝试这样做时,我会出错对于(int i=0;i)错误是什么?你能显示一些代码吗?看起来你的
新字符串[i]中缺少了一个分号;
split
默认情况下在空格上拆分;不需要正则表达式。很好的一点。我只是想明确一点,因为OP对这一点来说似乎很新。哇!谢谢你,我还没有真正介绍过“拆分”第二部分,我将研究这一部分并使用它。现在,从阅读你的文章开始。我知道你把它从“空间”中分离出来了左边是操作员,右边是号码。这不是你错了-你在正确的轨道上-这是这个答案真的感觉…空洞。是的,我会研究这个答案。这实际上是我的第一个答案。我只是不想破坏编程挑战。