Java 从字符串到整数函数
我正在尝试编写一个程序,将函数作为字符串接收并求解它。例如,“5*5+2/2-8+5*5-2”应返回41 我编写了乘法和除法的代码,它工作得非常完美:Java 从字符串到整数函数,java,string,function,methods,integer,Java,String,Function,Methods,Integer,我正在尝试编写一个程序,将函数作为字符串接收并求解它。例如,“5*5+2/2-8+5*5-2”应返回41 我编写了乘法和除法的代码,它工作得非常完美: public class Solver { public static void operationS(String m) { ArrayList<String> z = new ArrayList<String>(); char e= ' '; St
public class Solver
{
public static void operationS(String m)
{
ArrayList<String> z = new ArrayList<String>();
char e= ' ';
String x= " ";
for (int i =0; i<m.length();i++)
{
e= m.charAt(i);
x= Character.toString(e);
z.add(x);
}
for (int i =0; i<z.size();i++)
{
System.out.print(z.get(i));
}
other(z);
}
public static void other(ArrayList<String> j)
{
int n1=0;
int n2=0;
int f=0;
String n= " ";
for (int m=0; m<j.size();m++)
{
if ((j.get(m)).equals("*"))
{
n1 = Integer.parseInt(j.get(m-1));
n2 = Integer.parseInt(j.get(m+1));
f= n1*n2;
n = Integer.toString(f);
j.set(m,n);
j.remove(m+1);
j.remove(m-1);
m=0;
}
for (int e=0; e<j.size();e++)
{
if ((j.get(e)).equals("/"))
{
n1 = Integer.parseInt(j.get(e-1));
n2 = Integer.parseInt(j.get(e+1));
f= n1/n2;
n = Integer.toString(f);
j.set(e,n);
j.remove(e+1);
j.remove(e-1);
e=0;
}
}
}
System.out.println();
for (int i1 =0; i1<j.size();i1++)
{
System.out.print(j.get(i1)+",");
}
公共类求解器
{
公共静态无效操作(字符串m)
{
ArrayList z=新的ArrayList();
字符e='';
字符串x=“”;
对于(inti=0;i来说,寻求一个对你的具体问题没有帮助的答案,但希望它能帮助你更进一步
乍一看,您的代码存在各种问题:
你到处都在使用超短的变量名。这可能会为你节省1分钟的键入时间;每次阅读代码都会花费你5、10、x分钟的时间;或者将代码展示给其他人。因此:不要这样做。使用能说明名称背后的含义的名称
您正在使用大量低级代码。例如,您使用“couting for”循环来迭代列表(称为j,这真是太可怕了!)。这意味着:您使代码的阅读变得比应该的复杂得多
这样看来,似乎到目前为止还没有人告诉你,但代码的理念是:它应该易于阅读和理解。也许你不会因此得到分数,但请相信我:从长远来看,学习编写可读代码是一项非常重要的技能。如果这让你好奇,看看你是否能获得“干净代码”的帮助罗伯特·马丁著。研究那本书。然后再研究一遍。再研究一遍
但真正的问题是你解决这个问题的方法。我假设:这是学习作业的一部分。下一步你不会有简单的表达,比如“1+2*3”;而是要求你处理类似“sqrt(2)+3”的事情等等。然后你会被要求添加变量,等等。然后你的整个方法会被打破。因为你的简单字符串操作将不再这样做
从这个意义上说:您应该仔细研究这一点,并仔细研究Boann的第二个答案,以了解如何创建一个解析器,该解析器将您的输入字符串分解为表达式,然后进行计算。您的代码“同时”完成这两项工作;因此很难增强提供的功能。您有两个问题:
1) g=0;
if和else块后面的语句将使您进入无限循环
2) 根据您给出的输出,第一个减号(-)是Unicode字符连字符减号(U+002D)
,而第二个减号(–)是Unicode字符EN破折号(U+2013)
,因此(j.get(g))。等号(“-”)
第二个减号失败,因为它们不相等。您可以使用内置的Javascript引擎
public static void main(String[] args) throws Exception{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String code = "5*5+2/2-8+5*5-2";
System.out.println(engine.eval(code));
}
基本上不要重复你自己(枯燥的原则)。并且使用抽象(全名,合理时使用提取方法)。当使用多个方法时,静态方法有点麻烦。在这里,使用单独的方法很方便
也许你想要这样的东西:
Solver solver = new Solver();
List<String> expr = solver.expression("5*5+2/2-8+5*5-2");
String result = solver.solve(expr);
上述内容可以在几个方面进行改进。但它可读性强,可重写。公共类求解器{
public class Solver {
public static void main(String args[]) {
operation("5+2*5-6/2+1+5*12/3");
}
public static void operation(String m) {
ArrayList<Object> expressions = new ArrayList<Object>();
String e;
String x = "";
for (int i = 0; i < m.length(); i++) {
e = m.substring(i, i + 1);
if (!(e.equals("*") || e.equals("/") || e.equals("+") || e
.equals("-"))) {
x += e;
continue;
} else {
if (!x.equals("") && x.matches("[0-9]+")) {
int oper = Integer.parseInt(x);
expressions.add(oper);
expressions.add(m.charAt(i));
x = "";
}
}
}
if (!x.equals("") && x.matches("[0-9]+")) {
int oper = Integer.parseInt(x);
expressions.add(oper);
x = "";
}
for (int i = 0; i < expressions.size(); i++) {
System.out.println(expressions.get(i));
}
evaluateExpression(expressions);
}
public static void evaluateExpression(ArrayList<Object> exp) {
//Considering priorities we calculate * and / first and put them in a list mulDivList
ArrayList<Object> mulDivList=new ArrayList<Object>();
for (int i = 0; i < exp.size(); i++) {
if (exp.get(i) instanceof Character) {
if ((exp.get(i)).equals('*')) {
int tempRes = (int) exp.get(i - 1) * (int) exp.get(i + 1);
exp.set(i - 1, null);
exp.set(i, null);
exp.set(i + 1, tempRes);
}
else if ((exp.get(i)).equals('/')) {
int tempRes = (int) exp.get(i - 1) / (int) exp.get(i + 1);
exp.set(i - 1, null);
exp.set(i, null);
exp.set(i + 1, tempRes);
}
}
}
//Create new list with only + and - operations
for(int i=0;i<exp.size();i++)
{
if(exp.get(i)!=null)
mulDivList.add(exp.get(i));
}
//Calculate + and - .
for(int i=0;i<mulDivList.size();i++)
{
if ((mulDivList.get(i)).equals('+')) {
int tempRes = (int) mulDivList.get(i - 1) + (int) mulDivList.get(i + 1);
mulDivList.set(i - 1, null);
mulDivList.set(i, null);
mulDivList.set(i + 1, tempRes);
}
else if ((mulDivList.get(i)).equals('-')) {
int tempRes = (int) mulDivList.get(i - 1) - (int) mulDivList.get(i + 1);
mulDivList.set(i - 1, null);
mulDivList.set(i, null);
mulDivList.set(i + 1, tempRes);
}
}
System.out.println("Result is : " + mulDivList.get(mulDivList.size() - 1));
}
}
公共静态void main(字符串参数[]){
操作(“5+2*5-6/2+1+5*12/3”);
}
公共静态无效操作(字符串m){
ArrayList表达式=新的ArrayList();
字符串e;
字符串x=“”;
对于(int i=0;i for(int i=0;i并且您在for
循环中设置了g=0
,我认为这将是一个无限循环。@我想您是想“移动”您的评论到问题上。我认为您在这里“与”错误的人交谈;-)因为我想让它从一开始就检查@Whatzs@ZeldaX不,问题是你写的代码你不明白它在做什么。这是这里最重要的事情。这是很好的事情。总是有人识别“立即”问题也是。我似乎不明白数字2。如何在我的代码中解决这个问题?对不起,谢谢。这不是关于代码,而是关于输入。第二个减号不是减号,是破折号,它是一个不同的字符。哦,好的,谢谢!但是为什么“+”也不起作用呢?@uoyilmazI尝试了,输出是“43,–,2,”在你移除额外的g=0之后,在if块之外。所以“+”起作用。它的可能重复是为了一个赋值,我需要把它写成l
class Solver {
List<String> expression(String expr) {
String[] args = expr.split("\\b");
List<String> result = new ArrayList<>();
Collections.addAll(result, args);
return result;
}
String solve(List<String> args) {
solveBinaryOps(args, "[*/]");
solveBinaryOps(args, "[-+]");
return args.stream().collect(Collectors.joining(""));
}
private void solveBinaryOps(List<String> args, String opPattern) {
for (int i = 1; i + 1 < args.length; ++i) {
if (args.get(i).matches(opPattern)) {
String value = evalBinaryOp(args.get(i - 1), args.get(i), args.get(i + 1));
args.set(i, value);
args.remove(i + 1);
args.remove(i - 1);
--i; // Continue from here.
}
}
}
private String evalBinaryOp(String lhs, String op, String rhs) {
int x = Integer.parseInt(lhs);
int y = Integer.parseInt(rhs);
int z = 0;
switch (op) {
case "*":
z = x * y;
break;
case "/":
z = x / y;
break;
case "+":
z = x + y;
break;
case "-":
z = x - y;
break;
}
return Integer.toString(z);
}
}
public class Solver {
public static void main(String args[]) {
operation("5+2*5-6/2+1+5*12/3");
}
public static void operation(String m) {
ArrayList<Object> expressions = new ArrayList<Object>();
String e;
String x = "";
for (int i = 0; i < m.length(); i++) {
e = m.substring(i, i + 1);
if (!(e.equals("*") || e.equals("/") || e.equals("+") || e
.equals("-"))) {
x += e;
continue;
} else {
if (!x.equals("") && x.matches("[0-9]+")) {
int oper = Integer.parseInt(x);
expressions.add(oper);
expressions.add(m.charAt(i));
x = "";
}
}
}
if (!x.equals("") && x.matches("[0-9]+")) {
int oper = Integer.parseInt(x);
expressions.add(oper);
x = "";
}
for (int i = 0; i < expressions.size(); i++) {
System.out.println(expressions.get(i));
}
evaluateExpression(expressions);
}
public static void evaluateExpression(ArrayList<Object> exp) {
//Considering priorities we calculate * and / first and put them in a list mulDivList
ArrayList<Object> mulDivList=new ArrayList<Object>();
for (int i = 0; i < exp.size(); i++) {
if (exp.get(i) instanceof Character) {
if ((exp.get(i)).equals('*')) {
int tempRes = (int) exp.get(i - 1) * (int) exp.get(i + 1);
exp.set(i - 1, null);
exp.set(i, null);
exp.set(i + 1, tempRes);
}
else if ((exp.get(i)).equals('/')) {
int tempRes = (int) exp.get(i - 1) / (int) exp.get(i + 1);
exp.set(i - 1, null);
exp.set(i, null);
exp.set(i + 1, tempRes);
}
}
}
//Create new list with only + and - operations
for(int i=0;i<exp.size();i++)
{
if(exp.get(i)!=null)
mulDivList.add(exp.get(i));
}
//Calculate + and - .
for(int i=0;i<mulDivList.size();i++)
{
if ((mulDivList.get(i)).equals('+')) {
int tempRes = (int) mulDivList.get(i - 1) + (int) mulDivList.get(i + 1);
mulDivList.set(i - 1, null);
mulDivList.set(i, null);
mulDivList.set(i + 1, tempRes);
}
else if ((mulDivList.get(i)).equals('-')) {
int tempRes = (int) mulDivList.get(i - 1) - (int) mulDivList.get(i + 1);
mulDivList.set(i - 1, null);
mulDivList.set(i, null);
mulDivList.set(i + 1, tempRes);
}
}
System.out.println("Result is : " + mulDivList.get(mulDivList.size() - 1));
}
}