覆盖ArrayList对象初始化的先前实例时遇到问题

时间:2018-11-04 01:10:09

标签: java arraylist instance

编辑:我可以通过使实例变量静态化来解决它?如果是这样,为什么要解决此问题?这是我的教授在OOP入门课程中介绍的内容,所以我从未真正了解它。

所以,我不确定我是否正在使用糟糕的编码实践并且只是没有意识到这一点,但是我的程序遇到了一个令人毛骨悚然的问题,尽管有一个问题,但一切似乎都运行良好

该程序从参数文件中获取字符串,并根据指令执行命令。但是,当我发出命令“ x = x + 5”时,我遇到了严重的问题。

我的班级为Work的班级创建了我的另一个班级Read的另一个实例。当这样做时,我在Read顶部定义的ArrayList被新实例覆盖,因此删除了整个变量列表。我找不到使初始化仅执行一次的方法。我要去哪里错了?

工作:

import java.util.*;
public class Work {

static int Precedence(char ch){
    switch (ch){
        case '+':
        case '-':
            return 1;

        case '*':
        case '/':
        case '%':
            return 2;

        case '^':
            return 3;
    }
    return -1;
}

String infixConverter(String infix){

    Variable tvar = new Variable(); //consider removing these~
    Read reader = new Read();
    String pfix = new String("");
    Stack<Character> stack = new Stack<>();

    for (int i=0; i<infix.length(); ++i) {
        char curr = infix.charAt(i);
      //  if (Character.isLetterOrDigit(curr)||curr==' ') {
        if (Character.isDigit(curr)||curr==' ') {
            pfix += curr;
        }
        else if (Character.isLetter(curr)){
          //  Read reader = new Read();
            if (reader.varExists(curr)){
              //  Variable tvar = new Variable();
               int n = reader.getIndex(curr);
               tvar = reader.vars.get(n);
               pfix += tvar.getValue();
            }
            else{
                //error
            }
            //implement this below
            //check for letter within the string, if the string is

        }

        else if (curr == '('){
            stack.push(curr);
        }
        else if (curr == ')'){
            while (!stack.isEmpty() && stack.peek() != '(') {
                pfix += stack.pop();
            }

            if (!stack.isEmpty() && stack.peek() != '(') {
                return "Invalid Expression"; // invalid expression
            }
            else {
                stack.pop();
            }
        }
        else {
            while (!stack.isEmpty() && Precedence(curr) <= 
Precedence(stack.peek())) {
                pfix += stack.pop();
            }
            stack.push(curr);
        }
    }
    while (!stack.isEmpty()) {
        pfix += stack.pop();
    }
    int sol = postfixEvaluation(pfix);
    pfix = Integer.toString(sol);
    return pfix;
}


Integer postfixEvaluation(String pfix){
        Stack<Integer> stack = new Stack<>();

        for(int i = 0; i < pfix.length(); i++){
            char curr = pfix.charAt(i);

            if(curr == ' '){
                continue;
            }

            else if(Character.isDigit(curr)){
                int num = 0;

                while(Character.isDigit(curr)){
                    num = num*10 + (int)(curr-'0');
                        i++;
                    if (i==pfix.length()){break;}
                    curr = pfix.charAt(i);
                }
                i--;

                stack.push(num);
                //include variables and be able to insert them into here
            }

            else{
                int val1 = stack.pop();
                int val2 = stack.pop();

                switch(curr){
                    case '+':
                        stack.push(val2+val1);
                        break;

                    case '-':
                        stack.push(val2-val1);
                        break;

                    case '/':
                        stack.push(val2/val1);
                        break;

                    case '%':
                        stack.push(val2%val1);
                        break;

                    case '*':
                        stack.push(val2*val1);
                        break;
                }
            }
        }
        return stack.pop();
    }
}

阅读:

import java.util.*;
public class Read {
ArrayList<Variable> vars = new ArrayList<Variable>();//FIX THIS SHIT AHHHHHHHHH
Variable tempvar = new Variable();
Work eval = new Work();
private int lnNum = 1;
private String arg="";
public void thing() {
String thing,thing2;
if (arg.contains("print")){
    String real="";
    int i = arg.indexOf('t');
    if (i!=4){}//error
    thing = arg.substring(0,i);
    if (thing!="print"){}//error
    thing2 = arg.substring(i+2,arg.length());
    real = eval.infixConverter(thing2);
    System.out.println(real);
}
else if (arg.contains("read")){
    Scanner in = new Scanner(System.in);
    int i = arg.indexOf('d');
    if (i!=3){}//error
    thing = arg.substring(0,i+1);
    if (thing!="read"){}//error
    thing2 = arg.substring(i+2,arg.length());
    char c2 = thing2.charAt(0);
        if (thing2.length()>1){}//error
    System.out.println("Enter a value for "+thing2+": ");
        String vv = in.nextLine();
        vv = eval.infixConverter(vv);
        int vvv = Integer.parseInt(vv);
        tempvar.setValue(c2, vvv);
        vars.add(tempvar);



}

else if (arg.contains("=")){
   int i = arg.indexOf('=');
   int tempval;
   thing = arg.substring(0,i-1);
   thing2 = arg.substring(i+2,arg.length());
    if(thing.length()>1){}//error
    thing2=eval.infixConverter(thing2);
    char c = thing.charAt(0);
    if (vars.contains(thing)){
        tempval = Integer.parseInt(thing2);
        tempvar.setValue(c,tempval);
        int f = vars.indexOf(thing);
    }
    else if(Character.isLetter(c)){
        tempval = Integer.parseInt(thing2);
        tempvar.setValue(c,tempval);
        vars.add(tempvar);
    }

    else{
        //error
    }
}

else{

}
}

boolean varExists(char c){
    for (int i = 0; i<vars.size(); i++){
        tempvar = vars.get(i);
        if (tempvar.getTitle()==c){
            return true;
        }
    }
    return false;
}

int getIndex(char c) {
    for (int i = 0; i <= vars.size(); i++) {
        tempvar = vars.get(i);
        if (tempvar.getTitle() == c) {
            return i;
        }
    }
    return -1;
}

int inLineNum(){
lnNum++;
return lnNum;
}

void setArg(String c){
arg=c;
}

}

0 个答案:

没有答案