Top 10 HashMap

  O melhor criterio para contar as palavras e quantas vezes elas aparecem (cada uma) num texto,

é usar a estrutura HashMap no formato <String(Palavra),Integer(Vezes que apareceu)>.
Isto creio eu por sua alta velocidade de consulta.
Preciso ter no final de varrer um texto bastante grande, de um top 10 das palavras que mais apareceram
no texto que foi scaneado.
O que voces experientes programadores em Java me sugerem ? Que eu use o HashMap mesmo e tente
fazer um top 10 num ArrayList, organizando ele a cada iteracao de palavra ? Ou algor diferente talvez …
Algumas idéias ?

Desde já, grato.

acredito que TreeMap, já que os objetos são ordenaveis, deve facilitar o processo…

da uma olhada nesse esquema

esse outro esquema pode ajudar tb

a fonte é do blog do sergio taborda

Ah so uma coisa, não sei, mas talvez ter que mander a ordenação torne o TreeMap mais lento…

Olá
Uma outra idéia é você implementar a seguinte classe:

[code]
public class WordCount implements Comparable<WordCount> {
private String word;
private int count;

public WordCount(String word) {
	this.word = word;
}

public String getWord() {
	return word;
}

public int getCount() {
	return count;
}

public void incCount(int inc) {
	count += inc;
}

// O compareTo foi implementado de forma a ordenar as contagens em ordem decrescente.
public int compareTo(WordCount other) {
	return other.count - this.getCount();
}

// O equals retorna true se as palavras forem a mesma.
public boolean equals(Object other) {
	if (other == null || !(other instanceof String)) {
		return false;
	}
	
	return word.equals((String) other);
}

public int hashCode() {
	return word.hashCode();
}

public String toString() {
	return word + ": " + count;
}

}[/code]
E agora construa um Set dessa classe para armazenar as palavras e suas contagens ( o Set não vai permitir que palavras repetidas sejam armazenadas por causa do método equals, definido acima ).

[code]
// Palavra 1
WordCount wc1 = new WordCount(“Word1”);
wc1.incCount(10);

// Palavra 2
WordCount wc2 = new WordCount(“Word2”);
wc2.incCount(5);

// Palavra 3
WordCount wc3 = new WordCount(“Word3”);
wc3.incCount(2);

// Adicionando a um set fora de ordem
Set<WordCount> set = new TreeSet<WordCount>();
set.add(wc2);
set.add(wc1);
set.add(wc3);[/code]
A estrutura de dados se encarrega de ordenar as palavras em ordem decrescente do número de ocorrências.
Abraços

Pocha …
Muito obrigado à voces dois …
Gostei da ideia de tnaires ja que Lavieri disse que
pode ficar lento por ser TreeMap, pra falar a
verdade eu ja estava começando a estuda-lo.
Mas preferia ficar com HashMaps por serem os mais rapidos.
Valeu msm :smiley: