Inverter as String pelo meio da palavra JAVA

Eu gostava de inverter as palavras da String, mas não assim gato - otag mas sim inverter as 2 primeiras letras e as 2 finais para ficar agot.
Eu fiz este programa mas inverte a palavra toda para ficar otag.

        String line = "Ola o meu gato eh castanho";
		String [] words = line.split(" ");
		String resultado = "";
		String reverseWord = "";
	
		for(int i = 0; i < words.length; i++) {
		        String word = words[i];
		        for (int j = word.length() - 1; j >= 0; j--){
		    		      reverseWord +=  word.charAt(j);
		    	    }
		    	    resultado += reverseWord +" ";
		}

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.

1 curtida

obrigado