我目前遇到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();
}
}
}
答案 0 :(得分:4)
此问题的一个更有用的类是扫描仪。
Scanner文档位于: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
可以将扫描仪设置为从字符串,文件或输入流中读取。
扫描仪有几种有用的方法,包括:
您可以使用扫描仪获取第一个数字,然后使用某种循环对该数字执行操作,直到无法再执行操作为止。
答案 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