Ler frase e contar palavras!

Olá pessoal, tudo bem ?

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.

Disclaimer - acho que seu professor vai desconfiar :stuck_out_tongue:

import java.util.*;

class LicaoCasa {
    public int contarVezes (final String frase, final String palavra) {
        Map<String,Integer> frequencia = new HashMap<String,Integer>();
        String[] palavras = frase.split ("[\s.,?:;!@#$%&*()\-_+{}\[\]^~&lt&gt]+");
        for (String p : palavras) {
            if (frequencia.containsKey(p)) {
                frequencia.put (p, frequencia.get(p) + 1);
            } else {
                frequencia.put (p, 1);
            }
        }
        if (frequencia.containsKey (palavra))
            return frequencia.get (palavra);
        else
            return 0;
    }
    public static void main(String... args) {
        String frase = "Estou na ESCOLA e acho que a ESCOLA é legal";
        LicaoCasa lc = new LicaoCasa();
        System.out.println (lc.contarVezes (frase, "ESCOLA"));
        System.out.println (lc.contarVezes (frase, "colar"));
    }
}

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. ");
}

}[/code]

Tingol, pra que serve o método split???

diego2005,

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 :stuck_out_tongue: (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.

*correção da soluçâo

[code] public static int contarVezes(final String frase, final String palavra) {
int count = 0;
Matcher matcher = Pattern.compile("\b" + palavra + “\b”).matcher(frase);
while (matcher.find()) {
count++;
}

	return count;
}

public static void main(String args[]) {		
	System.out.print(  contarVezes("ESCOLA ESCOLA HAHAY ESCOLA!! MEU EMAIL É ESCOLADO-TESTE@HOTMAIL.COM","ESCOLA") );
}[/code]

thingol usando ER eu acho a forma mais inteligente de resolver essa questão

BY BUBA

[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 :slight_smile: ).
Nesse caso em especial, funcionou direitinho :stuck_out_tongue:
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=fsca]*correção da soluçâo

[code] public static int contarVezes(final String frase, final String palavra) {
int count = 0;
Matcher matcher = Pattern.compile("\b" + palavra + “\b”).matcher(frase);
while (matcher.find()) {
count++;
}

	return count;
}

public static void main(String args[]) {		
	System.out.print(  contarVezes("ESCOLA ESCOLA HAHAY ESCOLA!! MEU EMAIL É ESCOLADO-TESTE@HOTMAIL.COM","ESCOLA") );
}[/code]

thingol usando ER eu acho a forma mais inteligente de resolver essa questão

BY BUBA[/quote]

Eu concordo que seja. Testei sua expressão regular com aqueles casos de teste e efetivamente está funcionando direitinho.

Mas tem que ser digitada qualquer frase, não necessariamente essa.

Boa tarde!

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:

Ate!

[quote=maquiavelbona]Boa tarde!

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:

Ate![/quote]

Boa tarde !

Entendi cara, vou dar uma lida na apostila !

Obrigado

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.");
    }
    
}

Espero que seja útil.

Um abraço.

[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 :slight_smile: ).
Nesse caso em especial, funcionou direitinho :stuck_out_tongue:
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");
        
        
    }
    
}

Valeu pessoal, estou implantando o restante.

Muito Obrigado !

depois bota ae sua solução para os próximos… vai ajudar bastante!!!