Contagem de Frequência em um [] Strings

4 respostas
C

Prezados;
O que posso utilizar para a criação de um método que tenha como construtor um [] de Strings, e retorne um [] Strings com as Strings em ordem de maior freqüência, e quantas vezes ela se encontra no vetor?
Há alguma método, que realiza este tipo de operação?
Ou vou ter de realizar, comparação em todos os tipos de Strings, que possa conter o meu vetor?
Agradeço a todos.

Trajano

4 Respostas

Grinvon

Você foi muito confuso em sua abordagem. “método que tenha como construtor”??? WTF?? Pelo que entendi você quer algo do tipo:

Se o cara tiver
[0] “casa”
[1] “janela”
[2] “porta”
[3] “porta”
[4] “porta”
[5] “janela”

Nesse caso porta aprece 3 vezes no array, enquanto janela 2 e casa 1, então retornaria isso:

[0] “porta”
[1] “janela”
[2] “casa”
??

Isso que você quer? Se for da para fazer, mas não há método no array que faça isso automaticamente não.

ViniGodoy

Use um TreeMap<String, Integer> para contar a frequência de cada elemento do seu vetor.
Depois, crie uma lista de strings com as chaves e faça um comparator que ordene baseado no mapa.

Soa difícil, mas não é.

peczenyj

é o equivalente awk para

{ array[“palavra”]++ }

a cada palavra

T

Nada como o Sermão da Montanha*… Eu sabia que tinha uma coisa dessas que havia postado um dia desses.

(Eu queria achar uma versão que começasse com "Olhai os lírios do campo", que é o título de um livro de Érico Veríssimo.)

import java.util.*;

class TabelaFrequencias2 {
    /** 
    * Note que várias palavras podem ter a mesma freqüência. Portanto,
    * não podemos usar um Map < Integer, String > e sim um
    * Map < Integer, Set < String > >. 
    */
    public static void main(String[] args) {
        String texto = "Considerai os lírios, como eles crescem; não trabalham, nem " 
        + " fiam; e digo-vos que nem ainda Salomão, em toda a sua glória, se vestiu "
        + " como um deles. E, se Deus assim veste a erva que hoje está no campo e "
        + " amanhã é lançada no forno, quanto mais a vós, homens de pouca fé? Não "
        + " pergunteis, pois, que haveis de comer, ou que haveis de beber, e não "
        + " andeis inquietos.";
        String[] palavras = texto.split ("[ ,;.:?-]+");
        Map < String, Integer > tabFreq = new TreeMap < String, Integer > ();
        for (int i = 0; i < palavras.length; ++i) {
            String palavra = palavras [i];
            Integer freq = tabFreq.get (palavra);
            if (freq == null) {
                freq = 0;
            }
            tabFreq.put (palavra, freq + 1);
        }
        System.out.println ("Ordenando (ordem decrescente) por freqüências");
        Map < Integer, Set < String > > tabInv = new TreeMap < Integer, Set < String > > (new Comparator <Integer>() {
            public int compare (Integer i1, Integer i2) {
                return -i1.compareTo (i2);
            }
        });
        // Invertendo a tabela 
        for (Map.Entry < String, Integer > tab : tabFreq.entrySet()) {
            Integer freq = tab.getValue();
            String palavra = tab.getKey();
            if (!tabInv.containsKey (freq)) {
                tabInv.put (freq, new TreeSet < String > ());
            }
            tabInv.get (freq).add (palavra);
        }
        for (Integer freq : tabInv.keySet()) {
            System.out.println ("Palavras com a freqüência " + freq);
            System.out.println ("    " + tabInv.get (freq));
        }
    }
}
  • EDIT - Hum, acho que não era bem no Sermão da Montanha, de onde é que vem o tal trecho que usei como exemplo?
Criado 1 de novembro de 2007
Ultima resposta 1 de nov. de 2007
Respostas 4
Participantes 5