Uma opção seria obter o array de char
da string, trocar os caracteres nele e no final criar a nova string:
String line = "Ola o meu gato eh castanho";
String resultado = "";
for (String word: line.split(" ")) {
char[] chars = word.toCharArray();
for (int i = 0; i < chars.length; i += 2) { // for pula de 2 em 2
if (i + 1 != chars.length) { // se não estou no último, troca com o próximo
char tmp = chars[i];
chars[i] = chars[i + 1];
chars[i + 1] = tmp;
}
}
resultado += new String(chars) + " ";
}
System.out.println(resultado); // lOa o emu agot he actsnaoh
No for
eu pulo de 2 em 2 caracteres. Se eu não estiver no último (ou seja, se ainda tem um próximo caractere para trocar), eu troco.
Claro que isso só vai funcionar se as palavras estiverem separadas por espaços. Mas e se a frase for algo como "Olá, tudo bem? Eu vou bem."
aí já não funcionaria, pois ao fazer o split
por espaços você acabaria considerando que Olá,
é uma palavra, resultando em lO,á
.
Uma abordagem mais geral é varrer a string toda de uma vez e só trocar o caractere com o próximo se ambos forem letras. E em vez de concatenar várias strings, use um StringBuilder
, algo assim:
String line = "Olá, tudo bem? Eu vou bem.";
StringBuilder sb = new StringBuilder();
for (int i = 0; i < line.length(); i++) {
char c = line.charAt(i);
if (i < line.length() - 1 && Character.isLetter(c) && Character.isLetter(line.charAt(i + 1))) {
// se o atual e próximo são letras, adiciona o próximo
sb.append(line.charAt(i + 1));
i++; // não preciso mais analisar o próximo
}
// adiciona o atual
sb.append(c);
}
String resultado = sb.toString();
System.out.println(resultado); // lOá, utod ebm? uE ovu ebm.
Ou seja, se ainda tem o próximo caractere (i < line.length() - 1
) e tanto o caractere atual quanto o próximo são letras, é porque eles estão na mesma palavra e posso invertê-los.
Em qualquer outro caso (se um deles - ou ambos - não é letra, ou se é o último, etc), eu só mantenho o caractere atual, sem inverter com o próximo.