Nmaster88
Nmaster88

Reputation: 1585

removing last element of list not working JAVA

I'm doing my personal android calculator just for fun to learn Java and Android.

But the function is not working... the String list operacoes is where I have, in sequence the operators i will need (+,-,x and /). And the String list numeros is where I have the numbers to do the operations like for example: 32 45 232 12.

Maybe what I want to do in the code is hard to explain but I'll give it a try: I'm trying to do the x or / operations first and then reduce 1 element in numeros and operacoes list, and only after all of them are done I will go to + and - operations.

But it gives errors and I don't know what is wrong. Does someone has a clue?

The android compiler says:

 .UnsupportedOperationException
        at java.util.AbstractList.remove(AbstractList.java:638)
        at nunoprograms.com.nunoprogram.Operacoes.conta(Operacoes.java:54)
        at nunoprograms.com.nunoprogram.App2Activity.onClick(App2Activity.java:222)
        at android.view.View.performClick(View.java:4756)
        at android.view.View$PerformClick.run(View.java:19749)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

And code is:

public int conta(){

    int j,num1,num2,total=0;

    num1=Integer.parseInt(this.numeros.get(0));
       int x=this.operacoes.size();
       int y=0;

       for(int i=0;i<x-y;i++){//Objective: priority to x and / operations

        if(this.operacoes.get(i).equals("x")||this.operacoes.get(i).equals("/")) {
            if (this.operacoes.get(i).equals("x"))
                total = Integer.parseInt(this.numeros.get(i)) * Integer.parseInt(this.numeros.get(i+1));
            if (this.operacoes.get(i).equals("/"))
                total = Integer.parseInt(this.numeros.get(i)) / Integer.parseInt(this.numeros.get(i+1));

            this.numeros.set(i,String.valueOf(total));//atribui o valor da operaçao

            for (j=i;j<this.operacoes.size()-1;j++)this.numeros.set(j+1,this.numeros.get(j+2));
            for (j=i;j<this.operacoes.size()-1;j++)this.operacoes.set(j,this.operacoes.get(j+1));
            this.numeros.remove(this.numeros.size()-1);//remove last element
            this.operacoes.remove(this.operacoes.size()-1);
            y++;
        }
        }
    //now the + and - operations
    total=num1;
    for(int i=0;i<this.operacoes.size();i++) {

      num2=Integer.parseInt(this.numeros.get(i+1));
        System.out.println("conteudo da string de operacoes: "+ this.operacoes.get(i));

        if(this.operacoes.get(i).equals("+"))total+=num2;
        else if(this.operacoes.get(i).equals("-"))total-=num2;

    }
return total;
}

Operacoes Class:

public class Operacoes {

    private int numeros_size,operacoes_size;
    private List<String> numeros;
    private List<String> operacoes;

    Operacoes(List<String> x,int x_size, List<String> y, int y_size){
        this.numeros=x;
        this.numeros_size=x_size;
        this.operacoes=y;
        this.operacoes_size=y_size;
    }

    public int conta(){
    ...
    }

}

ADDED

I had to do this on the declaration of the String lists:

Operacoes(List<String> x,int x_size, List<String> y, int y_size){
    this.numeros=new ArrayList(x);
    this.numeros_size=x_size;
    this.operacoes=new ArrayList(y);
    this.operacoes_size=y_size;
}

It works now!

Upvotes: 0

Views: 140

Answers (1)

Eduardo Briguenti Vieira
Eduardo Briguenti Vieira

Reputation: 4589

You are probably working with an immutable array.

The java.util.Arrays.ArrayList version is immutable and its remove() method is not overridden. As such, it defers to the AbstractList implementation of remove(), which throws an UnsupportedOperationException.

Just see where you are creating the "numeros" or the "operacoes" array. If you want to work with a mutable array, instantiate a java.util.ArrayList instead to hold those values.


ADDED

In this class there must be a "numeros" and a "operacoes" class properties. In the code snippet provided, it's not shown how they are created.

Find where they are instantiated, and use a new Arraylist().


ADDED

Here is your constructor

Operacoes(List<String> x,int x_size, List<String> y, int y_size){
    this.numeros=x;
    this.numeros_size=x_size;
    this.operacoes=y;
    this.operacoes_size=y_size;
}

So you are receiving the numeros and operacoes as parameters.

The best way would be to see who is sending them and why they are immutable.

The easy way, just do this:

Operacoes(List<String> x,int x_size, List<String> y, int y_size){
    this.numeros= new ArrayList(x);
    this.numeros_size=x_size;
    this.operacoes= new ArrayList(y);
    this.operacoes_size=y_size;
}

Upvotes: 1

Related Questions