Estou com um problema para implementar uma lógica, eu quero movimentar meus elementos uma posição para direita de dentro do meu array.
Esse é meu código.
String alfabeto;
List<Character> letras ;
public Teste(){
letras = new ArrayList<Character>();
alfabeto = ("abcdefghijklmnopqrstuvwxyz");
}
public void trocaPosicaoAlfabeto(){
for(int i=0; i<alfabeto.length(); i++){
letras.add(alfabeto.charAt(i));
}
char aux;
for(int i=1; i<letras.size()-2; i++){
aux = letras.get(i-1);
letras.set(i, aux);
}
alfabeto="";
for(int i=0; i<letras.size(); i++){
alfabeto +=letras.get(i);
}
System.out.println(alfabeto);
}
e a saída é essa: aaaaaaaaaaaaaaaaaaaaaaaayz
a minha intenção é que a saída fique: zabcdefghijklmnopqrstuvwxy
alguém pode me ajudar?
É difícil de entender o que cada laço (for) está fazendo, recomendo que insra um comentário:
public void trocaPosicaoAlfabeto(){
// adiciona na lista de 'a' - 'y'
for(int i = 0; i < alfabeto.length - 1; i++){
letras.add(alfabeto.charAt(i));
}
// adiciona 'z' no inicio
letras.add(0, alfabeto.charAt(alfabeto.length - 1));
// copia a lista para a string
alfabeto="";
for(int i=0; i<letras.size(); i++){
alfabeto +=letras.get(i);
}
System.out.println(alfabeto);
Pode ser feito também, usando o substring:
alfabeto = "" + alfabeto.charAt(alfabeto.length - 1) + alfabeto.substring(0, alfabeto.length - 1);
Uma abordagem orientada a objetos:
import java.util.Arrays;
class PalavraRotatoria {
enum Direcao {
ESQUERDA, DIREITA;
}
final private char[] palavra;
PalavraRotatoria(char[] palavra) {
this.palavra = Arrays.copyOf(palavra, palavra.length);
}
PalavraRotatoria(String palavra) {
this.palavra = palavra.toCharArray();
}
String getPalavra() {
return new String(palavra);
}
PalavraRotatoria rotacionada(int quantidade, Direcao direcao) {
char[] resultado = new char[palavra.length];
int base = direcao == Direcao.DIREITA ? quantidade : palavra.length - quantidade;
for (int i = 0; i < palavra.length; i++) {
int novoIndice = (base + i) % palavra.length;
resultado[novoIndice] = palavra[i];
}
return new PalavraRotatoria(resultado);
}
@Override
public String toString() {
return getPalavra();
}
}
public class Main {
public static void main(String[] args) {
String alfabeto = "abcdefghijklmnopqrstuvwxyz";
PalavraRotatoria pl = new PalavraRotatoria(alfabeto);
for (int i = 0; i < 10; i++) {
System.out.println(pl.rotacionada(i, PalavraRotatoria.Direcao.DIREITA));
}
System.out.println();
for (int i = 0; i < 10; i++) {
System.out.println(pl.rotacionada(i, PalavraRotatoria.Direcao.ESQUERDA));
}
}
}
Outra codificação alternativa, considerando a diferencia de tempo de acordo com cada tipo de implementação na codificação a seguir.
import java.util.Arrays;
public class Teste {
public static void main(String[] args) {
String txt = "123456789";
int ciclo = 1000000;//extressando a codificação para encontrar, se livrar de um ArrayIndexOutOfBoundsException
char[] vetor = txt.toCharArray();
for (int i = 0; i < 10; i++) {
System.out.println("Diferença: " + String.format("%.2f", 100 - 100f * teste(vetor, ciclo, true) / teste(vetor, ciclo, false)) + "%\n");
}
}
//verifica o tempo de processamento em nano
private static long teste(char[] vetor, int ciclo, boolean giro1) {
long tempoGiroVetor = -System.nanoTime();
if (giro1) {
giroVetor(vetor, ciclo, true);
} else {
giroVetor2(vetor, ciclo, false);
}
tempoGiroVetor += System.nanoTime();
System.out.println(Arrays.toString(vetor) + " TempoGiro" + (giro1 ? 1 : 2) + ": " + +tempoGiroVetor);
return tempoGiroVetor;
}
//eficiência geralmente maior que o método giroVetor2
private static void giroVetor(char[] vetor, int len, boolean giroCanhoto) {
int limite = vetor.length - 1;
char auxiliar;
if (giroCanhoto) {
for (int i = 0; i < len; i++) {
auxiliar = vetor[0];
System.arraycopy(vetor, 1, vetor, 0, limite);
vetor[limite] = auxiliar;
}
} else {
for (int i = 0; i < len; i++) {
auxiliar = vetor[limite];
System.arraycopy(vetor, 0, vetor, 1, limite);
vetor[0] = auxiliar;
}
}
}
//alternativo, com mais peso ciclomático e menos linhas
private static void giroVetor2(char[] vetor, int len, boolean giroCanhoto) {
for (int i = 0; i < len; i++) {
char auxiliar = vetor[giroCanhoto ? 0 : vetor.length - 1];
System.arraycopy(vetor, giroCanhoto ? 1 : 0, vetor, giroCanhoto ? 0 : 1, vetor.length - 1);
vetor[giroCanhoto ? vetor.length - 1 : 0] = auxiliar;
}
}
}