对于我的项目,我正在创建一个包含多个功能的Excel电子表格。我目前正在尝试实现一种求和算法,该算法接收来自用户的输入并计算用户想要的数组中的总和。
例如,当用户键入控制台时:
A1 = 3
A2 = 2
A3 = 1
A4 =(总和A1 - C1)
每个单元格的单元格都有其受尊重的值,A4将包含A1到C1的总和,在本例中为六。我当前的代码包含单元格A1到C1的值到数组中。这是我正在尝试为我的电子表格实现计算的代码。
public String eval (Sheet sheet) {
String stuff = string.substring(2, string.length() - 2);
String [] arr = stuff.split(" ");
if (arr[0].equals("sum")) {
Double total = 0.0;
String alph = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String tempFirst = arr[1].substring(0, 1);
String tempSecond = arr[3].substring(0, 1);
int firstColumn = alph.indexOf(tempFirst);
int secondColumn = alph.indexOf(tempSecond);
int firstRow = Integer.valueOf(arr[1].substring(1));
int secondRow = Integer.valueOf(arr[3].substring(1));
if (firstColumn == secondColumn) {
for (int i = firstRow; i <= secondRow; i++) {
for (int j = firstColumn; j <= secondColumn; j++) {
total += Double.valueOf(sheet.referenceTwo(i, j));
}
}
}
}
for (int i = 0; i < arr.length; i += 2) {
arr[i] = sheet.referenceOne(arr[i]);
}
Double total = Double.valueOf(arr[0]);
for (int i = 1; i < arr.length; i += 2) {
if (arr[i].equals("*")) {
total = total * Double.valueOf(arr[i+1]);
}
else if (arr[i].equals("+")) {
total = total + Double.valueOf(arr[i+1]);
}
else if (arr[i].equals("-")) {
total = total - Double.valueOf(arr[i+1]);
}
else if (arr[i].equals("/")) {
total = total / Double.valueOf(arr[i+1]);
}
}
return total + "";
}
对于我的代码的这部分,它传递用户输入,在这种情况下将是和A1 - C1。然后它将它存储到一个数组中,该数组用空格分隔它。如果数组包含“sum”,它将通过以下代码。它解析A1和C1并获取数组的行和列位置。例如,对于A1,数组中的位置将为(0,0)。然后它将使用我的代码的另一部分中的sheetReferenceTwo方法,该方法返回数组中位置的值。
以下是我的方法的代码,用于计算数组中的信息
public String referenceOne (String location) {
String temp = location.substring(0, 1);
int letter = alph.indexOf(temp);
int num = Integer.valueOf(location.substring(1, 2)) - 1;
return contents[num][letter].eval(this);
}
public String referenceTwo (int row, int col) {
return contents[row][col].eval(this);
}
出于某种原因,我得到了一个
线程“main”中的异常java.lang.NumberFormatException:对于输入字符串:“u”
它停在Sheet.referenceOne(Sheet.java:41)
我目前仍然坚持要做什么来实现这一点,并希望得到一些建议。
答案 0 :(得分:0)
if (arr[0].equals("sum")) {
....
for (int i = 0; i < arr.length; i += 2) {
arr[i] = sheet.referenceOne(arr[i]);
}
参考上述代码,考虑arr[0]
等于"sum"
的情况。代码将输入传递此值的referenceOne
方法:
int num = Integer.valueOf(location.substring(1, 2)) - 1;
这将导致NumberFormatException
(它本质上是调用Integer.valueOf("u")
)。仅传递您希望传递给referenceOne
的相应数组元素。
答案 1 :(得分:0)
您应该考虑编写解析器和正确的表达式求值程序,而不是从输入中选择第一个和第二个字符。我认为你问题的一半并不是处理命令行。
IOW写类,如Token,Variable,Number,Expression等,让它们处理像Spreadsheet这样的对象。