2015-04-16 4 views
0

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

Но функция не работает ... Список строк operacoes - это то место, где у меня есть, в последовательности операторы i понадобятся (+, -, x и /). И список строк numeros есть, где у меня есть номера для выполнения операций, например, например: 32 45 232 12.

Возможно, что-то, что я хочу сделать в коде, сложно объяснить, но я попробую: Сначала я пытаюсь выполнить операции x или /, а затем уменьшу 1 элемент в списке numeros и operacoes, и только после того, как все они будут выполнены, я перейду к операциям + и -.

Но это дает ошибки, и я не знаю, что не так. У кого-то есть ключ?

андроид компилятор говорит:

.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) 

И код:

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 Класс:

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(){ 
    ... 
    } 

} 

ДОБАВЛЕНО

Я должен был сделать это при объявлении списков Струнные:

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

Он работает сейчас!

+0

Что происходит, когда размер равен нулю? – Leon

+0

Может ли [это] (http://stackoverflow.com/a/2965808/4762282) помочь вам? – Ircover

+0

какой размер вы спрашиваете? – Nmaster88

ответ

1

Возможно, вы работаете с неизменным массивом .

версия java.util.Arrays.ArrayList неизменна и его удалить() метод не переопределен. Таким образом, он отказывается от реализации RemoveList remove(), которая генерирует исключение UnsupportedOperationException .

Просто увидеть, где вы создаете "numeros" или "operacoes" массив. Если вы хотите работать с изменяемым массивом, вместо этого создайте экземпляр java.util.ArrayList, чтобы сохранить эти значения.


ДОБАВЛЕНО

В этом классе должно быть "numeros" и "operacoes" свойства класса. В приведенном фрагменте кода не показано, как они создаются.

Найти, где они были созданы, и использовать new Arraylist().


ДОБАВЛЕНО

Вот ваш конструктор

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

Таким образом, вы получаете в numeros и operacoes в качестве параметров.

Лучшим способом было бы узнать, кто их отправляет и почему они являются неизменными.

Самый простой способ, просто сделать это:

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

И как я могу это сделать? спасибо – Nmaster88

+0

вот как я их создал: – Nmaster88

+0

частный Список numeros; частный Список operacoes; – Nmaster88

Смежные вопросы