to usando esse código para transformar uma lista de texto em uma lista de palavras… porém quando a lista de texto é muito grande esse código é ruim acho que a complexidade dele é maior que n^2. Alguem conhece alguma maneira de otimizar isso?
for (int m=0; m < list.size(); m++ ){
StringTokenizer parser = new StringTokenizer(list.get(m));
while (parser.hasMoreTokens()) {
String aux = parser.nextToken();
aux = aux.replaceAll(",", "")
.replaceAll(";", "")
.replaceAll("\\.", "");
if (!lista.contains(aux )){
lista.add(aux);
}
}
}
Troque seu ArrayList por um TreeSet ou HashSet().
Seu código ficaria mais ou menos assim:
Set<String> lista = new TreeSet<String>(); // ou new HashSet<String>()
for (int m=0; m < list.size(); m++ ){
String[] tokens = list.get (m).split ("\\s+");
for (String token: tokens) {
lista.add (token.replaceAll ("[;,.]+", ""));
}
}
Evita o uso de StringTokenizer (cujo uso deve ser evitado em código que rode em Java 1.4 ou posterior)
Evita a inserção em uma lista simples tendo de procurar o elemento antes (que, como você desconfiou, tem complexidade O(N)).
for (int m=0; m < list.size(); m++ ){
StringTokenizer parser = new StringTokenizer(list.get(m));
while (parser.hasMoreTokens()) {
String aux = parser.nextToken();
aux = aux.replaceAll(",", "")
.replaceAll(";", "")
.replaceAll("\\.", "");
if (!lista.contains(aux )){
lista.add(aux);
}
}
}
por isso:
for (int m=0; m < list.size(); m++ ){
lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]", "").split("\\s+"))); // com o regex \\s+ fica melhor pois pode ter mais de um espaço entre palavras
}
[quote=entanglement]Troque seu ArrayList por um TreeSet ou HashSet().
Seu código ficaria mais ou menos assim:
Set<String> lista = new TreeSet<String>(); // ou new HashSet<String>()
for (int m=0; m < list.size(); m++ ){
String[] tokens = list.get (m).split ("\\s+");
for (String token: tokens) {
lista.add (token.replaceAll ("[;,.]+", ""));
}
}
Evita o uso de StringTokenizer (cujo uso deve ser evitado em código que rode em Java 1.4 ou posterior)
Evita a inserção em uma lista simples tendo de procurar o elemento antes (que, como você desconfiou, tem complexidade O(N)).[/quote]
for (int m=0; m < list.size(); m++ ){
StringTokenizer parser = new StringTokenizer(list.get(m));
while (parser.hasMoreTokens()) {
String aux = parser.nextToken();
aux = aux.replaceAll(",", "")
.replaceAll(";", "")
.replaceAll("\\.", "");
if (!lista.contains(aux )){
lista.add(aux);
}
}
}
por isso:
[code]
for (int m=0; m < list.size(); m++ ){
lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]", “”).split("\s+"))); // com o regex \s+ fica melhor pois pode ter mais de um espaço entre palavras
}
[quote=Algebra][quote=DaniloAndrade]e se vc trocar isso:
for (int m=0; m < list.size(); m++ ){
StringTokenizer parser = new StringTokenizer(list.get(m));
while (parser.hasMoreTokens()) {
String aux = parser.nextToken();
aux = aux.replaceAll(",", "")
.replaceAll(";", "")
.replaceAll("\\.", "");
if (!lista.contains(aux )){
lista.add(aux);
}
}
}
por isso:
[code]
for (int m=0; m < list.size(); m++ ){
lista.addAll(Arrays.asList(list.get(m).replaceAll("[,;.]", “”).split("\s+"))); // com o regex \s+ fica melhor pois pode ter mais de um espaço entre palavras
}
[/code][/quote]
ficou muito mais rápido danilo:
antes
153875
depois
1597
mas o problema é que ele adiciona repetidos[/quote]
facil de resolver troca o List lista = new ArrayList();
pelo Set lista = new HashSet()
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).[/quote]
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença!
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).[/quote]
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença![/quote]
Vc consegue ir mais longe tirando esse for. De onde vêm essa lista ? Porque vc não recebe o texto em um único String e recebe “frases” ?
assim evita o list.size() e o list.get(), que podem reduzir o desempenho (dependendo da implementação da lista).[/quote]
Ponto positivo pra vc Ataxexe. consegui melhorar ainda mais a média.
de 1597 para 1180 ms.
A principio a diferença parece pequena, mas para um grande volume de informações isso faz muita diferença![/quote]
Vc consegue ir mais longe tirando esse for. De onde vêm essa lista ? Porque vc não recebe o texto em um único String e recebe “frases” ?[/quote]
Essa lista vem do meu controller no grails
def lista = Documento.getAll().texto
Eu pego um campo chamado texto da minha classe documento.
Não consigo ver otimização neste ponto, dá pra fazer??