Programa Java para contar as ocorrências da letra "a" em uma frase

Fala pessoal! Sou novato em Java e preciso muito da ajuda de vcs… Me deparei com um exercício onde n sei o que pode estar acontecendo, pois o eclipse não critica o código, porém ele n executa…

Trata-se de um programa onde eu preciso apresentar a quantidade de vezes que a letra “a” aparece em uma frase.

Segue abaixo o meu código:

[code]package br.com.java.capitulo02;

public class Contando {

public static void main(String[] args) {
	String x = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.";

	int total=0;

	for(int i=0; i<=x.length();i++){
		char ch = x.charAt(i);
		String x1 = String.valueOf(ch);
		
		if(x1.equalsIgnoreCase("a")){
			total=total+1;

		}
	}

	System.out.println(total);

}

}[/code]

Obrigado!!! :slight_smile:

*editado. Adicionado tag code

roda ai

String x = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.";  
		 
		         int total=0;  
	   
		        for(int i=0; i<x.length();i++){  
	             char ch = x.charAt(i);  
		            String x1 = String.valueOf(ch);  
		              
	             if(x1.equalsIgnoreCase("a")){  
		                total=total+1;  
	   
		            }  
		        }  
	   
	         System.out.println(total);  
	}

tava dando java.lang.StringIndexOutOfBoundsException, vc tava acessando um valor a mais na String.

como o for (i) ta indo de zero ele tem q parar no numero anterior do length.

abraços!

Eu fiz bem simples, vc pode tentar passar tudo para minusculo e depois comparar, sei lá eu sei que

[code]class Contato2{

public static void main(String [] args){

	String x = "iaiaai ccc";
	int total = 0;
	for(int i = 0; i< x.length(); i++){
		if(x.charAt(i)== 'c'){
			total=total+1;
		}
	}
	System.out.println("total = " + total);
}

}[/code]

Vai minha sugestao…

[code]public class Contando {

public static void main(String[] args) {
	String x = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.";

	int total=0;

	for (int i=0;i<=x.length()-1;i++) {
		if (x.substring(i,i+1).equalsIgnoreCase("a"))
			total=total+1;
	}

	System.out.println(total);

}

}[/code]

:lol:

Obrigado galera!!! Me ajudaram bastante!!! :smiley:

Você pode tbm utilizar expressão regular e o metodo replace

[code]public static void main(String[] args) {
String x = “Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.”;

int total = x.replaceAll("[^a]", "").length();
System.out.println(total);

}[/code]

1 curtida

[quote=Astork]Você pode tbm utilizar expressão regular e o metodo replace

[code]public static void main(String[] args) {
String x = “Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.”;

int total = x.replaceAll("[^a]", "").length();
System.out.println(total);

}[/code]

[/quote]

e assim sem for e sem expressão regular, e em uma linha hehehehe

String a = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.";
System.out.println(a.split("a").length-1);

[quote] Focão
e assim sem for e sem expressão regular, e em uma linha hehehehe

String a = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos."; System.out.println(a.split("a").length-1); [/quote]

Tanto o método split como o replaceAll utilizam expressões regulares… !!!
E referente a fazer uma unica linha, foi feito em duas pois inicialmente no código apresentado, tinha a variavel total… !!!

O metodo split joga o resultado para uma array… o que não sei se neste caso seria uma solução melhor.

Att

Com certeza Astork expressão regular é sempre expressão regular e fim de papo quem manja manja.

Mas o problema é o ReplaceAll

long start1 = System.currentTimeMillis();   
int total1 = a.split("a").length-1;   
long delay1 = System.currentTimeMillis() - start1;   
System.out.println("Split Demorou " + delay1 + " milissegundos");  
long start2 = System.currentTimeMillis();   
int total2 = a.replaceAll("[^a]", "").length();   
long delay2 = System.currentTimeMillis() - start2;
System.out.println("ReplaceAll Demorou " + delay2 + " milissegundos");  

o split usa subSequence

ma ninha máq o split foi 15 milissegundos mais rápido.

[quote]o split usa subSequence

ma ninha máq o split foi 15 milissegundos mais rápido. [/quote]

Não consegui reproduzir este resultado… !!! executando as comparaçoes isoladas… !!! obtive o seguinte resultado

Split Demorou 16 milissegundos
ReplaceAll Demorou 16 milissegundos

Att.

Esqueci de mencionar… a galera poderia fazer uns testes… !!! pois acredito que seja algo interessante… !!!

Att

Astork

fiz outro teste e percebi que muda mesmo…

em Run as

Split Demorou 0 milissegundos
ReplaceAll Demorou 0 milissegundos

depois a o executar de novo em Debug as

Split Demorou 0 milissegundos
ReplaceAll Demorou 15 milissegundos

depois executei de novo

Split Demorou 15 milissegundos
ReplaceAll Demorou 16 milissegundos

depois em run as

Split Demorou 15 milissegundos
ReplaceAll Demorou 0 milissegundos

depois debug as

Split Demorou 0 milissegundos
ReplaceAll Demorou 15 milissegundos

coisas da VM

fiquei na dúvida agora…

public static void main(String[] args) {
	
		String a = "Os nomes das classes em Java precisam começar com letra e depois desta quaisquer combinações de letras e dígitos.";
		
		long start1 = System.currentTimeMillis();   
		int total1 = a.split("a").length-1;   
		long delay1 = System.currentTimeMillis() - start1;   
		System.out.println("Split Demorou " + delay1 + " milissegundos");  
		
		long start2 = System.currentTimeMillis();   
		int total2 = a.replaceAll("[^a]", "").length();   
		long delay2 = System.currentTimeMillis() - start2;
		System.out.println("ReplaceAll Demorou " + delay2 + " milissegundos");  

	}

alguém mais executou pra ver ?

Heheh… realmente Focão eu tbm fiquei na duvida… rsss e aqui aconteceu exatamente a mesma coisa… !!!

Já achei estranho ter dado 0 milissegundos, e estas variações… !!!

Mas valeu o post… foi bem proventoso.

faz a mesma operação dentro de um for de 5000 e ve c o tempo que demora é o mesmo =P

mais o fato é que de 15 milisec pra 16 ou pra 0 … tanto faz c não for nada que for usado a repetidamente e que realmente afete o desempenho

Para cronometrar uma operação que você sabe ser muito rápida,

a) Repita-a uma quantidade de vezes razoável, meça o tempo, e divida pela quantidade de vezes.

b) Use System.nanoTime (não se esqueça que, embora esse método tenha uma precisão de 1 nanossegundo, ou um bilionésimo de segundo, na prática ele tem uma exatidão bem menor, e dependente tanto do sistema operacional usado quanto do hardware. Acho que no Windows a exatidão é de cerca de 0.1 ms para System.nanoTime, mas não tenho certeza. (Ele usa QueryPerformanceCounter, se não me engano).

Portanto, você tem de combinar os métodos a) e b).

Além disso, o tempo de execução é diferente se o Java está só interpretando os bytecodes, ou se está usando os bytecodes já compilados para as instruções da máquina. Para forçar o Java a compilar seu código para código nativo, é necessário isolar a operação repetitiva em um método e executar esse método repetidamente uma determinada quantidade de vezes (talvez umas 1000 vezes, dependendo da configuração da sua JVM).

boas pessoal, estive a ver as formas dadas para ver a ocorrencia da letra “a” na frase, mas nao consegui adapta las para o meu caso, sera que alguem me poderia ajudar?

eu tenho 2 strings e quero contar quantos caracteres iguais têm as 2…

agradeço