[Resolvido] Busca utilizando TreeMap

6 respostas
N

Bom dia!

Pessoal estou precisando de umas dicas para finalizar um trabalho.

Preciso processar centenas de arquivos contendo vários textos, no final separar gerar um CSV contendo todas as palavras e as repetições.
Isso já está sendo feito, e crio um CSV seguindo o modelo abaixo.

javali;5 uniao;2 leitao;6 porcos;3 universo;1 pessoa;6
Agora tenho de utilizar um TreeMap para realizar uma busca nesse CSV, onde a busca possa ser feita da seguinte maneira:
Como parametro de entrada passo: uni*
Como resposta espero:

  • universo
  • uniao

A parte da criação/leitura/interpretação do CSV já está funcionando belezinha, só não sei como inserir esses registros na TreeMap e realizar a busca.

Alguém pode me dar uma luz?

Obrigado e aguardo respostas.

6 Respostas

E

Use http://docs.oracle.com/javase/6/docs/api/java/util/SortedMap.html#subMap(K,%20K).

Um exemplo para uni*:

import java.util.*;

class TesteSubMap {
    public static void main (String[] args) {
        SortedMap<String, String> map = new TreeMap<String, String>();
        map.put ("universo", "em desencanto");
        map.put ("uniao", "o melhor acucar");
        map.put ("planeta", "Marte");
        map.put ("resistencia", "eh inutil");
        for (SortedMap.Entry<String, String> entry : map.subMap ("uni", "uni" + "\uFFFF").entrySet()) {
            System.out.println (entry.getKey() + "=" + entry.getValue());
        }
    }
}
N

Nó, muito mais simples que eu imaginava :slight_smile:

Muito obrigado, vai atender perfeitamente para o que eu preciso.

Só tenho mais uma dúvida. O que seria “\uFFFF” ?

E

subMap tem 2 parâmetros: o valor inicial e o final.

O inicial é incluído no submapa, e o final é excluído do submapa.

Vou dar um exemplo com números: digamos que você tenha o conjunto dos números de 1 até 100 e quer mostrar os números de 50 até 59. Se for usar subMap, você tem de passar (50, 60), não 50, 59.

O uso de “\uFFFF” é o seguinte: esse caracter é o último caracter Unicode possível, portanto com certeza qualquer string que comece por “uni” vai ser incluída, exceto uma que comece por uni e que tenha essa letra “\uFFFF”.

N

Óh sim, compreendi :wink:

No caso se precisa-se pegar tudo que termina com “uni” eu usaria o:

for (Entry<String, Integer> entry : arvore.subMap ("\u0000" , "uni").entrySet()) { System.out.println (entry.getKey() + "=" + entry.getValue()); }
Seria isso para o caso reverso?

N

Para resolver o problema do: * fiz da seguinte maneira

for (Entry<String, Integer> entry : arvore.subMap("\u0000","\uFFFF" + busca).entrySet()) { if (entry.getKey().indexOf(busca) != -1) { System.out.println(entry.getKey() + "=" + entry.getValue()); } }

@entanglement
Obrigado por ajudar :slight_smile:

E

Completando o exemplo para os casos “termina com ___” e “contém ___”.

import java.util.*;

class TesteSubMap {
	private static String reverse (final String original) {
		return new StringBuilder (original).reverse().toString();
	}

    public static void main (String[] args) {
		// Tudo que começa por "uni"
        SortedMap<String, String> map = new TreeMap<String, String>();
        map.put ("universo", "em desencanto");
        map.put ("uniao", "o melhor acucar");
        map.put ("planeta", "Marte");
        map.put ("resistencia", "eh inutil");
		System.out.println ("-- Tudo que começa por 'uni' --");
        for (SortedMap.Entry<String, String> entry : map.subMap ("uni", "uni" + "\uFFFF").entrySet()) {
            System.out.println (entry.getKey() + "=" + entry.getValue());
        }
		// Tudo que termina com "ado"
        SortedMap<String, String> reverseMap = new TreeMap<String, String>();
        reverseMap.put (reverse ("deputado"), "Joselito Araujo");
        reverseMap.put (reverse ("Encantado"), "Rio Grande do Sul");
        reverseMap.put (reverse ("expiada"), "pagou por todas as suas culpas");
        reverseMap.put (reverse ("Encantado"), "Rio Grande do Sul");
        reverseMap.put (reverse ("deployed"), "also known as distributed");
		System.out.println ("-- Tudo que termina em 'ado' - forma 1 --");
        for (SortedMap.Entry<String, String> entry : reverseMap.subMap (reverse ("ado"), reverse ("ado" + "\uFFFF")).entrySet()) {
            System.out.println (reverse (entry.getKey()) + "=" + entry.getValue());
        }
		// Outra maneira
		reverseMap = new TreeMap<String, String>(new Comparator<String> () {
			public int compare (String s1, String s2) {
				return reverse(s1).compareTo(reverse(s2));
			}
		});
        reverseMap.put ("deputado", "Joselito Araujo");
        reverseMap.put ("Encantado", "Rio Grande do Sul");
        reverseMap.put ("expiada", "pagou por todas as suas culpas");
        reverseMap.put ("Encantado", "Rio Grande do Sul");
        reverseMap.put ("deployed", "also known as distributed");
		System.out.println ("-- Tudo que termina em 'ado' - forma 2 --");
        for (SortedMap.Entry<String, String> entry : reverseMap.subMap ("ado", "ado" + "\uFFFF").entrySet()) {
            System.out.println (entry.getKey() + "=" + entry.getValue());
        }		
		// Tudo que tem "men" no meio
		// Neste caso, tanto faz se é um TreeMap, um HashMap etc., já que você vai ter de varrer o mapa completo. 
		// Supondo que seja um map:
        Map<String, String> mapa = new HashMap<String, String>();
        mapa.put ("realmente", "finalmente");
        mapa.put ("amenidade", "docilidade");
        mapa.put ("recuperação", "superação");
        mapa.put ("bimensal", "assinatura");
		System.out.println ("-- Tudo que contém 'men' --");
        for (Map.Entry<String, String> entry : mapa.entrySet()) {
			if (entry.getKey().contains ("men"))
				System.out.println (entry.getKey() + "=" + entry.getValue());
        }		
    }
}
Criado 4 de julho de 2013
Ultima resposta 4 de jul. de 2013
Respostas 6
Participantes 2