我正在尝试将作为String给出的表达式转换为Integer。对于前者如果给出“1 + 5 * 5”,则该方法应返回“26”。我开始编写代码只是为了解决乘法,但是,当我运行它时,没有输出
public static void operationS(ArrayList<String> m)
{
for (int i=0; i<m.size(); i++)
{
while ( (m.get(i)).contains("*"))
{
int x = ((m.get(i)).indexOf("*"));
char A=((m.get(i)).charAt(x-1));
char B= ((m.get(i)).charAt(x+1));
int r= Character.getNumericValue(A)*Character.getNumericValue(B);
String numberAsString = Integer.toString(r);
if(x==1 && (m.get(i)).length()==3)
{
m.set(i, numberAsString);
}
if(x==1 && (m.get(i)).length()>3)
{
String n = numberAsString+((m.get(i)).substring(x+2));
m.set(i, n);
}
else
{
String k= ((m.get(i)).substring(0,x-1))+numberAsString+((m.get(i)).substring(x+2));
}
}
}
for (int u=0;u<m.size();u++)
{
System.out.println (m.get(u));
}
}
由于我无法导入任何库,我的行动计划是每次操作完成后都替换String。
我计划使用相同的循环来添加,减去和分割
答案 0 :(得分:0)
考虑解析你的表达。您可以使用前缀,中缀或后缀表示法和解析来评估输入表达式。
我看到一篇文章可以帮助您了解如何实现这一目标:
http://www.sunshine2k.de/coding/java/SimpleParser/SimpleParser.html
本文主要讨论解决这一问题的不同方法。
我个人喜欢递归方法。因此,如果你理解递归,你可以选择它。
但如果您只需要使用循环,则可能更喜欢其他方法之一。
更新:根据上面链接的文章添加实现递归的示例代码。
static final char[] ops = { '-', '+', '*', '/'};
static double evaluate(String s){
for(char op: ops) {
if(s.contains(String.valueOf(op))){
String op1 = s.substring(0, s.indexOf(op));
String op2 = s.substring(s.indexOf(op) + 1, s.length());
switch(op) {
case '-': return evaluate(op1) - evaluate(op2);
case '+': return evaluate(op1) + evaluate(op2);
case '*': return evaluate(op1) * evaluate(op2);
case '/': return evaluate(op1) / evaluate(op2);
}
}
}
/* at this point there is no operator in the term anymore, just a number */
return (convertToDouble(s));
}
private static double convertToDouble(String s) {
return Double.parseDouble(s);
}
答案 1 :(得分:0)
试试这个。
static String replaceAll(CharSequence cseq, String regex, Function<MatchResult, String> replacement) {
Matcher matcher = Pattern.compile(regex).matcher(cseq);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String replaced = replacement.apply(matcher.toMatchResult());
matcher.appendReplacement(sb, Matcher.quoteReplacement(replaced));
}
matcher.appendTail(sb);
return sb.toString();
}
static int toInt(String s) {
return Integer.parseInt(s);
}
和
String input = "1 + 5 * 5";
String output = input;
while (true) {
String r = replaceAll(output, "(\\d+)\\s*\\*\\s*(\\d+)",
m -> "" + (toInt(m.group(1)) * toInt(m.group(2))));
if (r.equals(output)) break;
output = r;
}
while (true) {
String r = replaceAll(output, "(\\d+)\\s*\\+\\s*(\\d+)",
m -> "" + (toInt(m.group(1)) + toInt(m.group(2))));
if (r.equals(output)) break;
output = r;
}
System.out.println(input + " -> " + output);
结果:
1 + 5 * 5 -> 26