Manipulando caracteres

Pessoal, nunca pensei que eu fosse fazer um post desses, mas aqui estou eu. Um professor passou um exercício na faculdade e eu não sei como fazer. Vou postar o enunciado:

“Faça um programa que armazene uma frase e mostre a quantidade de cada vogal contida na mesma,
além do total geral de vogais. Considere as vogais sem distinção entre maiúsculo e minúsculo. O retorno
para o usuário deverá apresentar a quantidade de cada vogal, o total das vogais e o tamanho da frase
informada pelo usuário”

O que acontece, eu não sei manipular caracteres com Java, nunca precisei disso antes. No C, eu criaria um vetor de caracteres ou um ponteiro e mandava ver, mas e no Java, como eu faço?

Eu andei procurando uma classe chamada char, mas não consegui entender se ela faz o que eu quero.

Não estou pedindo para que resolvam para mim, só quero saber o que usar e como usar.

Abraço.

Mais ou menos assim:

String texto = “Algum texto”;
char [] chars = texto.toCharArray();

Ai pra frente é igual a C, da um loop pelos caracteres verificando se é vogal e soma em uma variável.

Uma dica: a Classe Caracter tem os métodos estáticos toUpperCase e toLowerCase que pode te ajudar um pouco.

[quote=lsjunior]Mais ou menos assim:

String texto = “Algum texto”;
char [] chars = texto.toCharArray();

Ai pra frente é igual a C, da um loop pelos caracteres verificando se é vogal e soma em uma variável.

Uma dica: a Classe Caracter tem os métodos estáticos toUpperCase e toLowerCase que pode te ajudar um pouco.[/quote]

Obrigado, amigo. Agora tudo bem, como eu disse, eu nunca tinha feito isso em Java, daí o professor me pegou de surpresa.

Quando eu terminar, posto o código aqui. Eu vou fazer tudo dentro da classe Principal mesmo.

Abraço.

Trabalho pronto. Por enquanto só vou fazer isso, depois tento resolver outras coisas.


/* **********************************************************************************
 * Informações sobre o programa:												    *
 * 																				    *
 * O programa não está lendo frases inteiras, somente palavras. Corrigir isso.      *
 * O programa não trata vogais acentuadas, verificar se é preciso fazer isso ou não.*
 *                                                                                  *
 * **********************************************************************************/

import java.util.Scanner;


public class Principal {

	
	public static void main(String[] args) {
		
		String frase;
		char vetorFrase[];
		Scanner lerFrase = new Scanner(System.in);
		int qtdeA = 0, 
			qtdeE = 0, 
			qtdeI = 0, 
			qtdeO = 0, 
			qtdeU = 0,
			somaVogais =0;
		
		System.out.println("Digite uma frase, sem incluir acentos:");
		frase = lerFrase.next();
		
		vetorFrase = frase.toCharArray();
		
		for(int i = 0; i < vetorFrase.length; i++) {
			
			if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A')
				qtdeA++;
			else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E')
				 	 qtdeE++;
				 else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I')
					  	  qtdeI++;
				 	  else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O')
					       	   qtdeO++;
				 	  	   else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U')
						  	    	qtdeI++;
		}
		
		somaVogais = qtdeA + qtdeE + qtdeI + qtdeO + qtdeU;
		
		System.out.println("Quantidade de a-A = " + qtdeA 
						+ "\nQuantidade de e-E = " + qtdeE
						+ "\nQuantidade de i-I = " + qtdeI
						+ "\nQuantidade de o-O = " + qtdeO
						+ "\nQuantidade de u-U = " + qtdeU
						+ "\nQuantidade total de vogais = " + somaVogais);

	}

}

Só uma questão de estilo.
Essa “escada” não deveria existir. Formate assim o seu bloco de if, else ifs e else:

if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A') qtdeA++; else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E') qtdeE++; else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I') qtdeI++; else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O') qtdeO++; else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U') qtdeI++;

Ah, e para ler uma linha inteira (o que você chamou de frase) use o método nextLine de Scaner.

[]'s

[quote=davidbuzatto]Só uma questão de estilo.
Essa “escada” não deveria existir. Formate assim o seu bloco de if, else ifs e else:
[/quote]

Também acho feia essa escada, mas me ensinaram desse jeito, por isso eu mati a idéia. Vou corrigir daqui pra frente. Inclusive o eclipse corrige o else pra baixo do if e eu sempre achei que fosse teimosia.

[quote]
Ah, e para ler uma linha inteira (o que você chamou de frase) use o método nextLine de Scaner.
[]'s[/quote]

Obrigado pela dica, vou corrigir.

==================================================================

Editando: Postando o código com as alterações sugeridas:

/* **********************************************************************************
 * Informações sobre o programa:													*
 *								 												    *
 * Data: 11/11/2011																	*
 * 																				    *
 * O programa não está lendo frases inteiras, somente palavras. Corrigir isso.      *
 * O programa não trata vogais acentuadas, verificar se é preciso fazer isso ou não.*
 * 																					*
 * Data: 12/11/2011																	*
 * 																					*
 * Problema de não ler frases inteiras resolvido.   								*
 * Estilo do if-else modificado, retirado a "escada"	                            *
 * **********************************************************************************/

import java.util.Scanner;


public class Principal {

	
	public static void main(String[] args) {
		
		String frase;
		char vetorFrase[];
		Scanner lerFrase = new Scanner(System.in);
		int qtdeA = 0, 
			qtdeE = 0, 
			qtdeI = 0, 
			qtdeO = 0, 
			qtdeU = 0,
			somaVogais =0;
		
		System.out.println("Digite uma frase, sem incluir acentos:");
		frase = lerFrase.nextLine(); //Corrigido de lerFrase.next() para lerFrase.nextLine().
		
		vetorFrase = frase.toCharArray();
		
		for(int i = 0; i < vetorFrase.length; i++) {
			
			if(vetorFrase[i] == 'a' || vetorFrase[i] == 'A')
				qtdeA++;
			else if(vetorFrase[i] == 'e' || vetorFrase[i] == 'E')
				qtdeE++;
			else if(vetorFrase[i] == 'i' || vetorFrase[i] == 'I')
				qtdeI++;
			else if(vetorFrase[i] == 'o' || vetorFrase[i] == 'O')
				qtdeO++;
			else if(vetorFrase[i] == 'u' || vetorFrase[i] == 'U')
				qtdeI++;
		}
		
		somaVogais = qtdeA + qtdeE + qtdeI + qtdeO + qtdeU;
		
		System.out.println("Quantidade de a-A = " + qtdeA 
						+ "\nQuantidade de e-E = " + qtdeE
						+ "\nQuantidade de i-I = " + qtdeI
						+ "\nQuantidade de o-O = " + qtdeO
						+ "\nQuantidade de u-U = " + qtdeU
						+ "\nQuantidade total de vogais = " + somaVogais);

	}

}

Aproveitando seu código,como vc mostraria cada letra digitada ao invés da soma dela ?

for(int i = 0; i < vetorFrase.length; i++) {  
   System.out.print(vetorFrase[i]);            
}  

Dica: contar quantas letras “a” possui uma string:

String frase = "frase bem longa";
int qtde = frase.split("a").length - 1;
System.out.println("Frase tem " + qtde + " 'a'");

O split vai quebrar a string em vários arrays, aí basta contar quantos arrays foram retornados ;).

Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1;

[quote=Luizao]Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1; [/quote]

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS

[quote=Ravnus][quote=Luizao]Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1; [/quote]

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS[/quote]
Não disse que era mais simples ou fácil de entender, só quis ACRESCENTAR ao tópico uma outra forma de fazer.

[quote=Luizao][quote=Ravnus][quote=Luizao]Ah, se for contar desconsiderando maiusculas e minusculas, podemos usar uma lista na expressão regular:

int qtde = frase.split("[aA]").length - 1; [/quote]

Ah tá, o cara não entende nem sequer como pegar um caracter em um vetor e vai entender regex e o método split().

KISS[/quote]
Não disse que era mais simples ou fácil de entender, só quis ACRESCENTAR ao tópico uma outra forma de fazer.[/quote]

Ah, entendi. Perdão pelo meu entendimento equivocado. Eu pensei que você fosse mais um daqueles que querem mostrar como são bons em programação e não se importam se vão confundir ou não a pessoa que está com dúvida.