Você acima de tudo prescisa de outra string, ou outro char[], que é o alfabeto. O computador não tem como saber que A + 2 é C, A não ser que tenha um vetor que tenha ‘a’ na posição 0, ‘c’ na posição 2. Então você pode mandar o pc procurar no alfabeto ‘a’ e guardar o local, que e ‘0’. Então ele vai saber que 0 + 2 é 2, vai procurar na posição 2 e vai achar ‘c’.
Para esse vetor utilizei o alfabeto, que eu acho que é o que você quer.
Além de com "abcdefghijklmnopqrstuvwxyz".toCharArray(), que utilizei, você pode usar:
String alfabeto = "abcdefghijklmnopqrstuvwxyz";
Char[] prepalfabeto;
for ( int a = 0 ; a < alfabeto.length() ; ++a )
{
prepalfabeto[a] = alfabeto.charAt(a);
}
que pelo que vi você está mais acostumado a usar.
Quando você tiver esse char[] com o alfabeto, você pode criar um método como esse:
public static int procurar( char c, char[] alfabeto )
{
for ( int contador = 0 ; a < alfabeto.length ; a++ )
{
if ( c == alfabeto[ contador ] ) // Se o char c for iqual a posição [ contador ] do alfabeto.
return contador; // Retornar o contador, que encerra o método sem retornar -1;
}
return -1; // Retorna -1, caso o metodo não achou o char no alfabeto.
}
Então dentro deste loop:
//percorrendo a frase para deslocar as letras
for ( i=0; i< prepfrase.lenght; i++ ) // IMPORTANTE, Aqui, Utilize o prepfrase, não frase.
{
char antigo = prepfrase[i];
int index; // O local no alfabeto onde o char está. Exemplo, B seria 1, C seria 2, A seria 0.
index = procurar( antigo, alfabeto );
int codigoAtual = Integer.parseInt( prepcodigo[i] ); // Armazena o codigo como um int, usando a classe Integer
int novoLocal = index + codigoAtual; // Local do alfabeto em que a nova letra vai estar
char novo = alfabeto[ novoLocal ];
/* Exemplo: Palavra = casa
* Codigo: 3682
* Você quer que o 'c' se torne 'f', Certo? o método procurar armazena 2 em index, que é a posição de c no alfabeto.
* A prepcodigo armazena '3' no [0], que é a posição do c na palavra ( Primeira letra, usa primeiro numero do codigo );
* codigo atual armazena 3 no lugar de '3', usando Integer.parseInt( prepcodigo[i] )
* index ( que é dois ) + codigoAtual( que é 3 ) fica 5
* novoLocal sera então 5.
* Então, o novo char será a posição 5 do alfabeto, que é 'f'.
* prepfrase[i] = novo( 'f' ); */
prepfrase [i] = novo;
/* Isso funcionaria bem até o primeiro 'a', mais no 's', causaria um erro, ja que S, que está na posição 18 do alfabeto + 8, ficaria na posição 26.
* O alfabeto só vai até a posição 25, que é 'z'. Para resolver esse problema...
* Substitua:
* int novoLocal = index + codigoAtual
* por :
* int novoLocal = ( index + codigoAtual ) % alfabeto.length; Que pega o resto da divisão de index + codigoAtual pelo tamanho do alfabeto.
* Se index + codigoAtual for menor que o tamanho do alfabeto, o resultado será o mesmo.
* Caso não seja, o resultado sera o resto. No caso do 's' + 8, o resultado seria 0, já que 26 é o tamanho do alfabeto.
* char novo será então 'a' */
// prepfrase será então : fgac
}
Boa sorte, espero que ajude. Um contador para apontar a posição da chave não é necessario. ( Acredito eu );