Java 我的计算器不是&x27;t正确地调用变量

Java 我的计算器不是&x27;t正确地调用变量,java,arraylist,Java,Arraylist,我正在用java编写一个计算器,它有存储变量的内存。它正确地显示了变量列表、加减和定义变量,但每当我尝试做a=b+1之类的事情时,它都会将b视为0,给“a”一个值1 public static void main(String args[]) { Scanner scan = new Scanner(System.in); ArrayList<Integer> values = new ArrayList<>(); ArrayList<Str

我正在用java编写一个计算器,它有存储变量的内存。它正确地显示了变量列表、加减和定义变量,但每当我尝试做a=b+1之类的事情时,它都会将b视为0,给“a”一个值1

public static void main(String args[])
{
    Scanner scan = new Scanner(System.in);
    ArrayList<Integer> values = new ArrayList<>();
    ArrayList<String> variables = new ArrayList<>();

    while(scan.hasNextLine())
    {
        String line = scan.nextLine();
        String[] tokens = line.split(" ");

        if(!Character.isDigit(tokens[0].charAt(0)) && !line.equals("clear") && !line.equals("var"))
        {
            int value = 0;
            for(int i=0; i<tokens.length; i++)
            {
                if(tokens.length==1)
                {   
                    if(variables.contains(tokens[0]))
                    {
                        printAnswer(values.get(variables.indexOf(tokens[0])));
                    }
                    else if(!line.equals("quit"))
                    {
                        int width = 4 + tokens[0].length();
                        System.out.printf("%" + width + "s is not defined\n", tokens[0]);
                    }
                    break;
                }
                if(tokens.length==3)
                {
                    value = Integer.parseInt(tokens[2]);
                    printAnswer(value);
                    if(variables.contains(tokens[0]))
                    {
                        values.set(variables.indexOf(tokens[0]), value);
                        variables.set(variables.indexOf(tokens[0]), tokens[0]);
                    }
                    else
                    {
                        values.add(value);
                        variables.add(tokens[0]);
                    }
                    break;
                }

                else if(tokens[i].charAt(0) == '+')
                {
                    value = addition(tokens, value, variables, values);
                    printAnswer(value);

                    if(variables.contains(tokens[0]))
                    {
                        values.set(variables.indexOf(tokens[0]), value);
                    }
                    else
                    {
                        values.add(value);
                        variables.add(tokens[0]);
                    }
                    break;
                }

                else if(tokens[i].charAt(0) == '-')
                {
                    value = subtraction(tokens, value);
                    printAnswer(value);

                    if(variables.contains(tokens[0]))
                    {
                        values.set(variables.indexOf(tokens[0]), value);
                    }
                    else
                    {
                        values.add(value);
                        variables.add(tokens[0]);
                    }
                    break;
                }

                else if(i==tokens.length-1)
                {
                    System.out.println("No operation");
                    break;
                }
            }   
        }       

        if(Character.isDigit(tokens[0].charAt(0)))
        {
            int value = 0;
            for(int i=0; i<tokens.length; i++)
            {
                if(tokens.length==1)
                {
                    value = Integer.parseInt(tokens[0]);
                    printAnswer(value);
                    break;
                }

                else if(tokens[i].charAt(0) == '+')
                {
                    value = addition(tokens, value, variables, values);
                    printAnswer(value);
                }

                else if(tokens[i].charAt(0) == '-')
                {
                    value = subtraction(tokens, value);
                    printAnswer(value);
                }
            }
        }

        if(line.equals("clear"))
        {
            clear(variables, values);
        }

        if(line.equals("var"))
        {
            variableList(variables, values);
        }       

        else if(line.equals("quit"))
        {
            System.exit(0);
        }
    }
}

public static int addition(String[] a, int b, ArrayList<String> c, ArrayList<Integer> d)
{
    for(String item : a)
    {
        int i=0;
        if(Character.isDigit(item.charAt(0)))
        {
            int val = Integer.parseInt(item);
            b = b + val;
            i++;
        }
        else if(Character.isLetter(item.charAt(0)) && i!=0)
        {
            int val = d.get(c.indexOf(item));
            b = b + val;
        }   
    }
    return b;
}

public static int subtraction(String[] a, int b)
{
    int i=0;
    for(String item : a)
    {
        if(Character.isDigit(item.charAt(0)))
        {
            int val = Integer.parseInt(item);
            if(i==0)
            {
                b = b + val;
                i++;
            }
            else
            {
                b = b - val;
            }
        }
    }
    return b;
}

public static void clear(ArrayList<String> a, ArrayList<Integer> b)
{
    a.clear();
    b.clear();
}

public static void variableList(ArrayList<String> a, ArrayList<Integer> b)
{

    for(int i=0; i<a.size(); i++)
    {
        int width = 4 + a.get(i).length();
        System.out.printf("%" + width + "s: %d\n", a.get(i), b.get(i));
    }
}

public static void printAnswer(int a)
{
    int width = 3;
    Integer valueToString = a;
    String valueString = valueToString.toString();
    for(int j=0; j<=valueString.length(); j++)
    {
        width++;
    }
    System.out.printf("%" + width + "d\n",a);
}
publicstaticvoidmain(字符串参数[])
{
扫描仪扫描=新扫描仪(System.in);
ArrayList值=新的ArrayList();
ArrayList变量=新的ArrayList();
while(scan.hasNextLine())
{
String line=scan.nextLine();
String[]tokens=line.split(“”);
如果(!Character.isDigit(标记[0].charAt(0))&&&&!line.equals(“清除”)&&&!line.equals(“变量”))
{
int值=0;

对于(int i=0;i我可以向您解释为什么当您输入命令“a+b+1”时,程序将“a”设置为1,但这并不能真正帮助您。您需要仔细查看您的代码,一步一步地检查它,看看是否可以更合理地构造它,因为现在它只是一组串在一起的语句,实际上并没有定义任何有意义的行为。编写注释和使用更有意义的变量名非常有帮助

关于这一点,请注意:

  • 您从不在循环中检查“=”符号。这意味着命令:

    “a=b+1”

    “a+b+1”

    …以完全相同的方式进行处理,将值1指定给“a”

  • 您的加减法不考虑任何位置。这意味着遇到的第一个运算符将应用于字符串中的所有标记。即:

    “一个c+d-3--x5”

    …与以下内容完全相同:

    “一个c+d+++35 x”

    (请注意,这两个字符串完全是胡说八道)


尝试使用调试器逐步检查代码并查看它在做什么。这将对您有很大帮助。

请使用注释。这将帮助我们是的,请描述
加法中使用的数组是什么。其他人在说什么。如果您告诉我们您的程序是如何工作的,速度会更快。否则,我们必须坐下来思考你可能已经知道了。看起来有200多行,问题可能在任何地方。在循环体中:if(tokens.length==3),你只看其中的两个标记,token[0]和token[2]。但是你想把第一个设置为另外两个的总和。我主要关心的是加法,int val=d.get(c.indexOf(item));未生成正确的值。它似乎得到了0。它应该得到与给定变量对应的值,因为它检查变量的索引并使用值数组中的索引(与变量数组并行)