[Resolvido] Busca utilizando TreeMap

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.

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ó, 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” ?

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”.

Ó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?

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:

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());
        }		
    }
}