Problemas com replaceAll

Os replaces estão se acumulando e no final o resultado não é o desejado.
Exemplo:

string str "laranja goiaba banana";
str = str.replaceAll("laranja", "goiaba").replaceAll("goiaba", "banana").replaceAll("banana", "laranja");
System.out.print(str);

O resultado que eu queria obter era “goiaba banana laranja”, mas o que aparece é “laranja laranja laranja” porque eles se acumulam, como resolver?

Não é problema, é o comportamento esperado deste método.

  • Começa com: “laranja goiaba banana”
  • Substituindo laranja por goiaba fica: “goiaba goiaba banana”
  • Substituindo goiaba por banana fica: “banana banana banana”
  • Substituindo banana por laranja fica: “laranja laranja laranja

Pra fazer exatamente o que vc quer (tirar laranja do inicio e colocar no final) o código abaixo é o suficiente.

String str = "laranja goiaba banana";
str = str.replaceAll("(laranja)(.*)", "$2 $1");
System.out.println(str);

Se quiser algo mais robusto, terá que usar mais que uma simples String. Pensei numa outra possível solução, com certeza não é a melhor que já viu, mas fiz só pra oferecer uma alternativa:

String[] arr = "laranja goiaba banana".split(" ");

String temp = arr[0];

for (int i = 0, j = 1; j < arr.length; i++, j++)
    arr[i] = arr[j];

arr[ arr.length - 1 ] = temp;

System.out.println( String.join(" ", arr) );
1 curtida

Eu entendi, mas não era o esperado no meu caso. Estou tentando fazer um código que mude letras especificas para outras com cada letra indo 4 letras para frente:
ABCDE - EFGHI, mas no final isso vai como IFGHI
Uma espécie de replaceAll que funcione tudo de uma vez só, entende?

Aqui… não sei se entendi muito bem… mas pra fazer essa alteração de letras vai ser mais simples (e performatico) trabalhar com o charcode que com regex.