Проблемы с перезаписью предыдущего экземпляра инициализации объекта ArrayList - PullRequest
0 голосов
/ 04 ноября 2018

РЕДАКТИРОВАТЬ: Я мог исправить это, сделав переменную экземпляра статической? Если так, почему это исправляет это? Это было то, что мой проф вошёл в мое вступление к ООП-классу, поэтому я так и не узнал об этом.

итак, я не уверен, что использую ужасную практику кодирования и просто не осознаю этого, но у меня есть одна серьезная проблема с моей программой, несмотря на эту проблему, кажется, все работает нормально .

Эта программа берет строки из файла аргументов и выполняет команды в соответствии с инструкциями. Однако, когда я выполняю команду "x = x + 5", я испытываю серьезную проблему.

Мой класс под названием Work создает еще один экземпляр моего другого класса Read. Когда это происходит, ArrayList, который я определяю в верхней части Read, перезаписывается новым экземпляром и, таким образом, удаляет весь список переменных. Я не могу найти способ выполнить инициализацию только один раз. Куда я иду не так?

Работа:

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;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...