Eu estou recebendo o erro não pode encontrar o símbolo quando o código atinge a chamada recursiva para incremento e não tenho idéia por quê? Aqui está o código para incremento. Qualquer ajuda será muito apreciada.
public void increment() { Integer first = 0; Character ch = num.charAt(num.length()-1); Integer last = Character.digit(ch, 10); if (num.length() > 1) { if (last == 9) { last = 0; if (num.length() >= 2) { String temp = new String(num.substring(0, num.length()-2)); temp.increment(); } else { last++; } } } else { if (last == 9) { last = 0; first = 1; } else { last++; } } String t = new String(); String x = new String(); t = last.toString(); x = first.toString(); if (first > 0) { num.concat(x); } num.concat(t); }
EDIT: Eu sou muito novo para o java para o mais básico você pode fazer suas respostas, melhor. Ok, então o erro que estou recebendo é: BigNatural.java.35: não é possível encontrar o método de símbolo de símbolo increment () location: class java.lang.String temp.increment ()
E para esclarecer quaisquer outras questões aqui é o código inteiro.
public class BigNatural { private String num; public BigNatural(String input) { num = input; } public BigNatural(BigNatural input) { num = input.toString(); } public BigNatural(Integer input) { num = input.toString(); } public BigNatural() { Integer i = 0; num = i.toString(); } public void increment() { Integer first = 0; Character ch = num.charAt(num.length()-1); Integer last = Character.digit(ch, 10); if (num.length() > 1) { if (last == 9) { last = 0; if (num.length() >= 2) { String temp = new String(num.substring(0, num.length()-2)); temp.increment(); } else { last++; } } } else { if (last == 9) { last = 0; first = 1; } else { last++; } } String t = new String(); String x = new String(); t = last.toString(); x = first.toString(); if (first > 0) { num.concat(x); } num.concat(t); } public void decrement() { Character ch = num.charAt(num.length()-1); Integer last = Character.digit(ch, 10); if(num.length() > 1) { if(last == 0) { String temp = new String(num.substring(0, num.length()-2)); temp.decrement(); } else { last--; } } else { if(last > 0) { last--; } else { last = 0; } } String t = new String(); t = last.toString(); num.concat(t); } public String toString() { return num; }
} public class BigNatural {
private String num; public BigNatural(String input) { num = input; } public BigNatural(BigNatural input) { num = input.toString(); } public BigNatural(Integer input) { num = input.toString(); } public BigNatural() { Integer i = 0; num = i.toString(); } public void increment() { Integer first = 0; Character ch = num.charAt(num.length()-1); Integer last = Character.digit(ch, 10); if (num.length() > 1) { if (last = 2) { String temp = new String(num.substring(0, num.length()-2)); temp.increment(); } } else { last++; } } else { if (last == 9) { last = 0; first = 1; } else { last++; } } String t = new String(); String x = new String(); t = last.toString(); x = first.toString(); if (first > 0) { num.concat(x); } num.concat(t); } public void decrement() { Character ch = num.charAt(num.length()-1); Integer last = Character.digit(ch, 10); if(num.length() > 1) { if(last == 0) { String temp = new String(num.substring(0, num.length()-2)); temp.decrement(); } else { last--; } } else { if(last > 0) { last--; } else { last = 0; } } String t = new String(); t = last.toString(); num.concat(t); } public String toString() { return num; }
}
String não possui um método chamado incremento. E é claro que não é uma chamada recursiva porque você está dentro de um object (qual object? No seu código não existe uma definição de class), enquanto isso você está invocando o incremento em um object String.
Além disso, seu campo temporário nunca é usado. Se você quiser compartilhá-lo entre as chamadas de método, você pode tentar algo assim:
public void increment (String temp){}
e depois passá-lo enquanto chama:
String temp = new String(num.substring(0, num.length()-2)); increment(temp);
Claro que sua function não pode funcionar assim. O parâmetro temp deve ser gerenciado dentro do seu método de incremento. Revise sua lógica. Não é mais uma questão de syntax. Se você não puder alterar a assinatura do método, declare temp como um campo da sua class BigNatural:
public class BigNatural { private String num; private String temp ......
e o método de incremento interno simplesmente faz:
temp = new String(num.substring(0, num.length()-2));
Alguns outros pointers:
String é uma class imutável que significa que, uma vez criada, não poderá mais ser alterada. Então, fazendo
String t = new String(); t = last.toString();
agora faz sentido, já que você criará 2 String Objects aqui ( last.toString()
criará e retornará uma nova String).
Simplesmente faça:
String t = last.toString();
ou melhor ainda:
num.concat(last.toString());
O mesmo vale para o String temporário, simplesmente faça:
String temp = num.substring(0, num.length()-2);
Em seguida, esteja ciente de autoboxing não intencional:
Integer first = 0; first++;
isso criará um novo Objeto Inteiro toda vez que first++
for executado; Inteiro (como String) é imutável. Ao calcular simplesmente use o int
primitivo em vez de Integer
.
Finalmente, tenha cuidado para não criar um loop infinito. Se eu entendi o seu código num será concatenado a so num.length() > 1
será verdadeiro sempre se fosse verdade na primeira vez.