Estou aprendendo java e o professor pediu esse programa e estou com dificuldades, o problema maior é fazer com que ele conte a quantidade de vezes que a palavra foi digitada. Vocês podem me ajudar?
Muito Obrigado !
Faça um programa em Java que receba uma frase e uma palavra, calcule e mostre a quantidade de vezes que a palavra digitada aparece na frase
Exemplo: Estou na ESCOLA e acho que a ESCOLA é legal
Palavra: ESCOLA
Resposta: A palavra ESCOLA apareceu 2 vezes na frase.
Eu fiz assim (é claro que a opção do tingol deve ser melhor):
[code]import java.util.StringTokenizer;
public class ContarPalavras
{
public static int frequencia(final String frase, final String palavra)
{
int qtdade = 0;
StringTokenizer st = new StringTokenizer(palavra);
while (st.hasMoreTokens())
if(st.nextToken().contains(palavra))
qtdade++;
return qtdade;
}
public static void main(String[] args)
{
String frase = "Estou na ESCOLA e acho que a ESCOLA é legal";
String palavra = "ESCOLA";
int n = frequencia(frase, palavra);
System.out.println("A palavra " + palavra + " apareceu 2 vezes na frase. ");
}
a) split é o substituto do StringTokenizer, que não deve ser usado (a classe foi considerada “deprecated”)
b) Acho que você não entendeu minha intenção. Escrevi uma rotina que claramente não dá para o OP copiar com casca e tudo e entregar para o professor (pode ser que o professor esteja lendo este post também). Gostaria que o OP tentasse escrever ele mesmo a rotina.
c) Fora o uso do “contains” (que iria dar um falso positivo se houvesse a palavra “ESCOLADO” na frase dada como exemplo), e o uso do StringTokenizer (deprecated), o seu código seria mais rápido e faria o serviço melhor.
[code]
public static int contarVezes(final String frase, final String palavra) {
return (frase.split(palavra)).length -1;
}
public static void main(String args[]) {
System.out.print( contarVezes(“Estou na ESCOLA e acho que a ESCOLA é legal”) );
}[/code][/quote]
Isto é um modo clássico de resolver problemas - pensar ao contrário (em vez de procurar a palavra ESCOLA, considerá-la como um separador de palavras ).
Nesse caso em especial, funcionou direitinho
Só que “split” é mais sutil que parece; vamos ver o que ocorre para diversos casos.
class TesteSplit2 {
public static void main(String args[]) {
String[] testes = {
"Estou na ESCOLA e acho que a ESCOLA é legal", // resultado: 2 - esperado: 2
"ESCOLA", // resultado: -1 - esperado: 1
"Acho que não aprendi nada na ESCOLA", // resultado: 0 - esperado: 1
"", // resultado: 0 - esperado: 0
"O seu amigo é muito DESCOLADO" // resultado: 1 - esperado: 0
};
for (String teste : testes) {
System.out.println (teste.split("ESCOLA").length - 1);
}
}
}
Ou seja, a idéia é legal, mas precisa de burilamento.
Sem querer ser mau-educado, mas ai voce adequa ne fio?
Eles ja te deram o mais dificil pronto, faca agora a parte mais simples.
Ler faz bem e o que voce quer tem na apostila da Caelum disponibilizada aqui:
Sem querer ser mau-educado, mas ai voce adequa ne fio?
Eles ja te deram o mais dificil pronto, faca agora a parte mais simples.
Ler faz bem e o que voce quer tem na apostila da Caelum disponibilizada aqui:
Caro ecordao, acho que o código abaixo é mais didático e econômico:
public class Main {
public static void main(String[] args){
ContarPalavra("Estou na ESCOLA e acho que a ESCOLA é legal","escola");
}
public static void ContarPalavra(String pFrase, String pPalavra){
//primeiro vamos igualar a frase e a palavra em caixa alta:
pFrase = pFrase.toUpperCase();
pPalavra = pPalavra.toUpperCase();
int Numero = 0;
//aqui iremos popular um array com as palavras da frase passada:
String[] frase = pFrase.split(" ");
//nesse laço, comparamos as palavras da frase com a palavra passada,
//e acumular o número de igualdades em um contador.
for(int i=0;i<frase.length;i++){
if(frase[i].equals(pPalavra)) Numero+=1;
}
//agora imprimimos o resultado
System.out.println("A palavra \"" + pPalavra + "\" apareceu " + Numero + " vezes na frase passada.");
}
}
[quote=thingol][quote=fsca]Eu acho que isso resolve seu problema
[code]
public static int contarVezes(final String frase, final String palavra) {
return (frase.split(palavra)).length -1;
}
public static void main(String args[]) {
System.out.print( contarVezes(“Estou na ESCOLA e acho que a ESCOLA é legal”) );
}[/code][/quote]
Isto é um modo clássico de resolver problemas - pensar ao contrário (em vez de procurar a palavra ESCOLA, considerá-la como um separador de palavras ).
Nesse caso em especial, funcionou direitinho
Só que “split” é mais sutil que parece; vamos ver o que ocorre para diversos casos.
class TesteSplit2 {
public static void main(String args[]) {
String[] testes = {
"Estou na ESCOLA e acho que a ESCOLA é legal", // resultado: 2 - esperado: 2
"ESCOLA", // resultado: -1 - esperado: 1
"Acho que não aprendi nada na ESCOLA", // resultado: 0 - esperado: 1
"", // resultado: 0 - esperado: 0
"O seu amigo é muito DESCOLADO" // resultado: 1 - esperado: 0
};
for (String teste : testes) {
System.out.println (teste.split("ESCOLA").length - 1);
}
}
}
Ou seja, a idéia é legal, mas precisa de burilamento.
[/quote]
Também é uma excelente forma, mas fica ainda melhor assim:
public class OutraForma {
public static void contarVezes(String frase, String palavra) {
frase = frase.toUpperCase();
palavra = palavra.toUpperCase();
int Numero = (frase.split(" " +palavra+ " ")).length -1;
System.out.print("A palavra \"" + palavra + "\" apareceu " + Numero + " vezes na frase passada.");
}
public static void main(String args[]) {
contarVezes("Estou na ESCOLA e acho que a ESCOLA é descolada","escola");
}
}