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
importjava.util.*;classLicaoCasa{publicintcontarVezes(finalStringfrase,finalStringpalavra){Map<String,Integer>frequencia=newHashMap<String,Integer>();String[]palavras=frase.split("[\s.,?:;!@#$%&*()\-_+{}\[\]^~<>]+");for(Stringp:palavras){if(frequencia.containsKey(p)){frequencia.put(p,frequencia.get(p)+1);}else{frequencia.put(p,1);}}if(frequencia.containsKey(palavra))returnfrequencia.get(palavra);elsereturn0;}publicstaticvoidmain(String...args){Stringfrase="Estou na ESCOLA e acho que a ESCOLA é legal";LicaoCasalc=newLicaoCasa();System.out.println(lc.contarVezes(frase,"ESCOLA"));System.out.println(lc.contarVezes(frase,"colar"));}}
D
diego2005
Eu fiz assim (é claro que a opção do tingol deve ser melhor):
importjava.util.StringTokenizer;publicclassContarPalavras{publicstaticintfrequencia(finalStringfrase,finalStringpalavra){intqtdade=0;StringTokenizerst=newStringTokenizer(palavra);while(st.hasMoreTokens())if(st.nextToken().contains(palavra))qtdade++;returnqtdade;}publicstaticvoidmain(String[]args){Stringfrase="Estou na ESCOLA e acho que a ESCOLA é legal";Stringpalavra="ESCOLA";intn=frequencia(frase,palavra);System.out.println("A palavra "+palavra+" apareceu 2 vezes na frase. ");}}
Tingol, pra que serve o método split????
T
thingol
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 (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
fsca
*correção da soluçâo
publicstaticintcontarVezes(finalStringfrase,finalStringpalavra){intcount=0;Matchermatcher=Pattern.compile("\b"+palavra+"\b").matcher(frase);while(matcher.find()){count++;}returncount;}publicstaticvoidmain(Stringargs[]){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
thingol
fsca:
Eu acho que isso resolve seu problema
publicstaticintcontarVezes(finalStringfrase,finalStringpalavra){return(frase.split(palavra)).length-1;}publicstaticvoidmain(Stringargs[]){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.
classTesteSplit2{publicstaticvoidmain(Stringargs[]){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(Stringteste:testes){System.out.println(teste.split("ESCOLA").length-1);}}}
Ou seja, a idéia é legal, mas precisa de burilamento.
T
thingol
fsca:
*correção da soluçâo
publicstaticintcontarVezes(finalStringfrase,finalStringpalavra){intcount=0;Matchermatcher=Pattern.compile("\b"+palavra+"\b").matcher(frase);while(matcher.find()){count++;}returncount;}publicstaticvoidmain(Stringargs[]){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
ecordao
Mas tem que ser digitada qualquer frase, não necessariamente essa.
M
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!
E
ecordao
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
mapeixoto
Caro ecordao, acho que o código abaixo é mais didático e econômico:
publicclassMain{publicstaticvoidmain(String[]args){ContarPalavra("Estou na ESCOLA e acho que a ESCOLA é legal","escola");}publicstaticvoidContarPalavra(StringpFrase,StringpPalavra){//primeiro vamos igualar a frase e a palavra em caixa alta:pFrase=pFrase.toUpperCase();pPalavra=pPalavra.toUpperCase();intNumero=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(inti=0;i<frase.length;i++){if(frase[i].equals(pPalavra))Numero+=1;}//agora imprimimos o resultadoSystem.out.println("A palavra \""+pPalavra+"\" apareceu "+Numero+" vezes na frase passada.");}}
Espero que seja útil.
Um abraço.
M
mapeixoto
thingol:
fsca:
Eu acho que isso resolve seu problema
publicstaticintcontarVezes(finalStringfrase,finalStringpalavra){return(frase.split(palavra)).length-1;}publicstaticvoidmain(Stringargs[]){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.
classTesteSplit2{publicstaticvoidmain(Stringargs[]){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(Stringteste: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:
publicclassOutraForma{publicstaticvoidcontarVezes(Stringfrase,Stringpalavra){frase=frase.toUpperCase();palavra=palavra.toUpperCase();intNumero=(frase.split(" "+palavra+" ")).length-1;System.out.print("A palavra \""+palavra+"\" apareceu "+Numero+" vezes na frase passada.");}publicstaticvoidmain(Stringargs[]){contarVezes("Estou na ESCOLA e acho que a ESCOLA é descolada","escola");}}
E
ecordao
Valeu pessoal, estou implantando o restante.
Muito Obrigado !
M
mederafael
depois bota ae sua solução para os próximos… vai ajudar bastante!!!