在按照BODMAS规则解决复杂的数学表达式的Java中创建计算器的尝试失败后,我认为创建一个参数为字符串的方法很重要。这种方法应检测括号和数学符号(即加,次,减,除,打开和关闭 括号),并且应将上述任意两个符号之间的任何字符串(例如 temp )转换为重复声明< strong> temp2 ,除非 temp 为空(即“”)。然后,该方法将 temp2 值和符号以与参数中相同的顺序存储在Objects列表中。该方法考虑到,如果第一个字符为数字,则要放置在列表中的第一个对象应该是参数的子串的双精度值,该值从零到第一个的索引标志。如果最后一个字符是列表最后一个索引中的数字,则等效操作完成。 上面的想法使我创建了以下项目:
suggest_next_locations
即使我导入了上面的类并调用方法getNumber,上面的代码也看起来令人满意,如下所示:
package maths.calculator;
import java.util.ArrayList;
public class NumGetter {
static String expression;
static ArrayList<Integer> preList = new ArrayList<>();
static ArrayList<Object> list = new ArrayList<>();
public static ArrayList<Object> getNumber(String num) {
expression = num;
try {
if (expression == null) {
expression = "";
}
if (expression == "") {
return list;
}
int condition = 0;
for (char chars : expression.toCharArray()) {
if (chars == '-' || chars == '+' || chars == '÷' || chars == '×' || chars == ')' || chars == '(') {
preList.add(condition);
}
condition++;
}
if (preList.size() != 0) {
System.out.println(preList);
if (expression.charAt(0) >= '0' && expression.charAt(0) <= '9') {
String local = expression.substring(0, preList.get(0));
list.add(Double.parseDouble(local));
}
for (int i = 0; i < (preList.size() - 1); i++) {
int min = preList.get(i);
int next = preList.get(i + 1);
String local = expression.substring(min + 1, next);
if (local.length() == 0) {
list.add(expression.charAt(min));
} else {
double temp = Double.parseDouble(local);
list.add(expression.charAt(min));
list.add(temp);
}
}
if (expression.charAt(num.length() - 1) >= '0' && expression.charAt(num.length() - 1) <= '9') {
condition = preList.get(preList.size() - 1);
String local = expression.substring(condition);
list.add(expression.charAt(condition));
list.add(Double.parseDouble(local));
}
} else {
list.add(Double.parseDouble(expression));
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return list;
}
}
问题出在输出中。在每种情况下都会引发异常。通常,上面的结果是:
import java.util.ArrayList;
import maths.calculator.NumGetter;
public class Text {
public static void main(String[] args) {
System.out.println("(12+8)0");
String one = "(12+8)0";
ArrayList<Object> two = NumGetter.getNumber(one);
System.out.println(two.toString());
}
}
但是,当我将迭代Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:373)
at java.base/java.util.ArrayList.get(ArrayList.java:425)
at maths.calculator.NumGetter.getNumber(NumGetter.java:43)
at demo.Text.main(Text.java:12)
(12+8)0
[0, 3, 5]
更改为for (int i = 0; i < (preList.size() - 1); i++)
时,顺便说一句,这应该是不正确的,结果非常接近预期的答案:
for (int i = 0; i < (preList.size() - 2); i++)
可能出了什么问题... 我非常需要你的大脑。
答案 0 :(得分:0)
以下是在jQuery(document).ready(function(){
$( '.check' ).on('click', function(){
if( $(this).is(":checked") ) {
$('.container .other-class').removeClass('item-2').addClass('your-class-name');
} else {
$('.container .other-class').removeClass('your-class-name').addClass('item-2');
}
});
});
循环的第二次迭代中抛出异常java.lang.StringIndexOutOfBoundsException: String index out of range: -1
的行:
for
第一次第一次迭代:String local = number.substring(++min, next); //line throwing exception
第二次迭代:number.substring(1, 1);
在第二次迭代中,它引发异常,因为不允许number.substring(2, 1);
方法的beginIndex大于lastIndex。有关更多信息,请查看here。
谢谢
答案 1 :(得分:0)
终于。我不敢相信最后一个错误是在最后一个if块中:
String local = expression.substring(condition);
我认为应该是:
String local = expression.substring(condition+1);
感谢所有人,尤其是@Andreas