Como fazer uma "pesquisa" em IO?

6 respostas
H

Hello Everyone! :smiley:

Minha dúvida é:
Tenho um Txt com várias linhas formando uma espécie de tabuada:
1 x 1 = 1
1 x 2 = 2

10 x 10 = 100

Quero utilizar um objeto para encontrar qualquer linha.
Exemplo: Se eu pedir para procurar “9 x 9” eu quero que ele retorne o número da linha que tenha “9 x 9”

Já tenho um objeto do tipo Scanner que é capaz de ler todas as linhas (uma de cada vez) e por tratamentos ele consegue me retornar… Mas acredito que, se for um Txt com 1.000 linhas ou mais, escanear cada linha e tratar uma por uma vai levar muito tempo.

Então quero saber se há uma classe que consiga encontrar de imediato a linha desejada e então retornar a String da linha.

Ex:

Classe procurar = new Classe(); //cria um objeto procurar do tipo Classe (ainda não sei qual) int linha = procurar.verLinhaQueTem("3 x 3");//retorna o número exato da linha que tem "3 x 3" String resposta = procurar.imprimirLinha(linha);//retorna o que tem na linha ("3 x 3 = 9") System.out.println(resposta);
Tks!

6 Respostas

Roger75

Acho que seria melhor usar um SGBD ao invés de txt e criar um index na coluna em que as consultas serão feitas.

H

Na realidade o Txt seria como se fosse meu BD…
E os index seriam as multiplicações… “1 x 1”, “1 x 2”…

Quando você entra em um bloco de notas, por exemplo, e procura (Ctrl + F) por algum dado, ele rapidamente verifica se tem esse dado e indica onde está esse dado…
Sei disso pois já testei em um que tem ~20.000 linhas…

No Bloco de Notas foi instantâneo, já em meu programa demorou…

Eu poderia até utilizar um BD, mas eu quero algo simples, pois fazer isso em BD pesa muito, já Txt não…

Você não conhece alguma forma de pesquisa por String em que eu poderia achar rapidamente a linha do dado em que procuro? Alguma Classe pronta? Ou um algorítimo?

Roger75

Se o texto já for ordenado, então tente implementar uma busca binária (http://pt.wikipedia.org/wiki/Pesquisa_binária)

matheuslmota

Se for o caso você pode fazer algum mapeamento no seu arquivo. Por exemplo, se sua string tiver um formato definido, por exemplo “A x A”, como é o que parece a partir do que você está postando, você pode criar um Map associonado o uma string a um numero de linha. Posteriomente, você pode usar um RandomAccessFile para acessar uma parte específica do arquivo e pegar a linha inteira.
Há um bom tempo atrás eu respondi esse tópico e no meu último post eu coloquei um código de uma classe que mapeia um arquivo de texto a partir de suas linhas e fornece um método para recuperar uma linha a partir do número dela. Tente adaptar isso ao seu problema (embora a melhor solução seja usar um SGBD, como foi indicado antes).

H

Muito interessante suas dicas…

Vou tentar implementá-las e ver no que dá…

Obrigado!

regis_hideki

Pro problema em questão, seria muito mais fácil analisar a String e efetuar a operação de multiplicação.

De qualquer forma, se for só por curiosidade, eu serializaria um Map e faria as buscas nele. Isso poderia ser feito de várias formas. Exmeplos:

1-com Map<String, Integer>. Esse é mais próximo do que você quer.

para preencher:

map.put("6 x 7", 6*7);

para recuperar a informação:

map.get("6 x 7");

2-com Map<Integer, Map<Integer, Integer>>. Esse é um pouco diferente, mas parece interessante também.

para preencher:

Map<Integer, Integer> mapInterior = new HashMap<>(); mapInterior.put(7, 6*7); map.put(6, mapInterior);

para recuperar:

map.get(6).get(7);
Criado 29 de março de 2013
Ultima resposta 30 de mar. de 2013
Respostas 6
Participantes 4