Método() que intercala uma String em Maiúscula e Minúscula

Segue o enunciado do exercicio que estou em dúvida:

Método alternaCaseVogCons(String): mostra em maiúsculas as vogais e em minúsculas as consoantes de uma string passada como parâmetro:

Hoje choveu muito :arrow: hOjE chOvEU mUItO

Aew galera sou inciante e venho até aqui pedir ajuda de vocês. Quem puder da uma idéia ficarei muito grato.

  1. A String tem um método chamado charAt.
  2. A classe Character tem os método toUpperCase e toLowerCase;
  3. Use um if para testar se é vogal ou consoante. Dica, você pode usar o método contains da classe String.
  4. Você vai precisar de um for.

Este é um método não óbvio para fazer quase o que você quer (ele mostra alternada, maiúsculo e minúsculo). Não se baseie nele.

[code]public class UpAndDown {
public static void main(String[] args) {
String teste = “Esta e a string de TESTE”;

	StringBuilder sb  = new StringBuilder();
	for (int i = 0; i < teste.length(); i++) {
		char ch = teste.charAt(i);
		if (ch == ' ') {
			sb.append(' ');
			continue;
		}
		sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32));
	}
	System.out.println(sb.toString());		
}

}
[/code]

Ele também não funciona com caracteres acentuados, ou caracteres especiais, como o ç.

Cara muito obrigado deu uma clariada boa…

Só não entendi esta linha

sb.append(i % 2 == 0 ? (char) (ch & 95) : (char)(ch | 32));

sei que o metodo “append” você esta adicionando conteudo a StringBuilder até ai entendi, mais do ponto de interrogação para frente eu não entendi.

Desde já agradeço!!

Além da forma citada pelo ViniGogoy, há outras soluções utilização de expressão regular, só que é mais complexo.
Pensando rápido, a solução mais fácil que achei foi assim:

public void alternaCaseVogCons(String s){
	s = s.toLowerCase(); //primeiro eu coloco todas as letras em minúsculo.
	s = s.replace("a", "A");
	s = s.replace("e", "E");
	s = s.replace("i", "I");
	s = s.replace("o", "O");
	s = s.replace("u", "U");
	return s;	
}

Espero que ajude!
Valeu!

O ponto de interrogação é o operador ternário, que é praticamente um bloco if-else compacto.

[code]// condição ? retorno-se-verdadeira : retorno-se-falsa;

sb.append(i % 2 == 0 ? (char) (ch & 95) : (char) (ch | 32)); [/code]

Ou seja, se o resto da divisão de i por 2 for 0, anexe no StringBuilder (char) (ch & 95), senão, anexe (char) (ch | 32).

Sobre as operações bitwise, elas fazem exatamente o que você quer:

code (‘A’ | 32) // ‘a’
(char) (‘a’ | 32) // ‘a’
(char) (‘A’ & 95) // ‘A’
(char) (‘a’ & 95) // ‘A’[/code]

Esses operadores ( &, |, ^, ~, <<, >>, >>> ) operam diretamente nos bits de valores inteiros (byte, short, int, long). Um char também pode ser representado como um inteiro, portanto é compatível. O cast para char antes da expressão pode parecer redundante, mas é necessário devido ao fato de que o resultado de uma operação bitwise é um inteiro.

Como eu falei, aquele é o método obscuro… Ali estou fazendo é uma operação com bits, pq um dos bits é que define se a letra a maiúscula ou minúscula.

Mas enfim… veja o meu primeiro post e logo vc mesmo elabora seu algoritmo. AS outras soluções apresentadas não servem para seu professor até agora…

Perfeito a explicação ViniGodoy, agradeço a atenção, foi de grande ajuda, td oq você falou eu ainda não tinha vista na faculdade. Obrigado mesmo. :wink: :wink:

[quote=Richard Mendes Madureira]Além da forma citada pelo ViniGogoy, há outras soluções utilização de expressão regular, só que é mais complexo.
Pensando rápido, a solução mais fácil que achei foi assim:

public void alternaCaseVogCons(String s){
	s = s.toLowerCase(); //primeiro eu coloco todas as letras em minúsculo.
	s = s.replace("a", "A");
	s = s.replace("e", "E");
	s = s.replace("i", "I");
	s = s.replace("o", "O");
	s = s.replace("u", "U");
	return s;	
}

Espero que ajude!
Valeu![/quote]

Muito Obrigado Richard sem dúvida ajudou…

abraço

Vc poderia fazer assim tb

s = s.toLowerCase() .replace("a", "A") .replace("e", "E") .replace("i", "I") .replace("o", "O") .replace("u", "U");

outra forma seria ter 2 strings, uma em lowercase e a outra em uppercase e compor uma terceira string caracter por caracter baseado em alguma regra (vogais, por exemplo). ai ER cairia como uma luva. ou um mini strategy aonde vc chama upper ou lower apropriado.