Ler frase e contar palavras!

13 respostas
E

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.

13 Respostas

T

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

Eu fiz assim (é claro que a opção do tingol deve ser melhor):

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

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

T

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.

F

*correção da soluçâo

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 É [email removido]","ESCOLA") );
	}

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

BY BUBA

T
fsca:
Eu acho que isso resolve seu problema
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") );

}
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 :P 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.
T
fsca:
*correção da soluçâo
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 É [email removido]","ESCOLA") );
	}

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

BY BUBA

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

E

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

M

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!

E

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!

Boa tarde !

Entendi cara, vou dar uma lida na apostila !

Obrigado

M

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.

M
thingol:
fsca:
Eu acho que isso resolve seu problema
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") );

}
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 :P 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.

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

Valeu pessoal, estou implantando o restante.

Muito Obrigado !

M

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

Criado 23 de outubro de 2006
Ultima resposta 24 de out. de 2006
Respostas 13
Participantes 7