Simplificar código

Boa Tarde!

Não sei se tem como simplificar essa parte, mas segue o código…

while (linha_arq1 != null) {

                File arq2 = new File(arquivo2);
                InputStream isarq2 = new FileInputStream(arquivo2);
                InputStreamReader israrq2 = new InputStreamReader(isarq2);
                BufferedReader brarq2 = new BufferedReader(israrq2);
                String linha_arq2 = brarq2.readLine(); 

                while ((linha_arq2 != null)) {

                    linha_arq2 = brarq2.readLine();

                }

     linha_aqr1 = brarq1.readLine();
}

Toda vez que o arquivo 2 chega no final ele sai do while sobe para o outro while e começa novamente do início do arquivo2. Essa parte de instanciar tudo para voltar para a primeira linha do arquivo2, tem como fazer de outro jeito?

Obrigado

acredito que ninguem ainda te ajudou pq o codigo ta um pouco confuso e oq vc quis fazer tb…
(o povo aqui responde rapido =)

se o linha1, nao usa nada do linha2 nem o linha2 usa nada do linha1, pq o while do linha2 dentro do linha 1?

Esse arquivo2 é sempre o mesmo arquivo? ou a cada execução do seu primero while ele é um arquivo diferente?

Poste o restante do código, pelo o que eu estou vendo, você precisa ler um arquivo se caso um outro exista, ou muda como @digaoneves sugeriu.

São somente 2 arquivos…
No arquivo1 eu pego uma linha e verifico essa linha para todas as linhas do segundo arquivo…
Depois pego a segunda linha do arquivo1 e verifico essa linha para todas as linhas do segundo arquivo…

A idéia e simplificar esta parte abaixo, tenho que sempre fazer a parte de baixo para voltar novamente para a primeira linha do arquivo2?

File arq2 = new File(arquivo2);  
                InputStream isarq2 = new FileInputStream(arquivo2);  
                InputStreamReader israrq2 = new InputStreamReader(isarq2);  
                BufferedReader brarq2 = new BufferedReader(israrq2);  
                String linha_arq2 = brarq2.readLine();   

[quote=igor_ks]acredito que ninguem ainda te ajudou pq o codigo ta um pouco confuso e oq vc quis fazer tb…
(o povo aqui responde rapido =)

se o linha1, nao usa nada do linha2 nem o linha2 usa nada do linha1, pq o while do linha2 dentro do linha 1?[/quote]

Não coloquei o código completo , a idéia e vê se tem como simplificar a parte para voltar para a primeira linha do arquivo 2…

Dependendo do número de vezes que seu while vai rodar, talvez fosse melhor você ler o seu arquivo e jogar as linhas em uma lista, aí não tem mais que acessar o arquivo pra ler a mesma coisa.

o primeiro while irá rodar umas 353 vezes e o while de dentro rodará no pior caso 8 milhões de vezes, ou seja, na pior caso é 353 X 8 milhões.

o primeiro while irá rodar umas 353 vezes e o while de dentro rodará no pior caso 8 milhões de vezes, ou seja, na pior caso é 353 X 8 milhões.[/quote]

Com certeza é melhor jogar tudo pra memória, e até tentar dar uma aprimorada nisso tudo, no que você precisa comparar a linha INTEIRA precisa ser igual? ou alguma chave? talvez numérica.

São somente 2 arquivos, eles sempre existem…

Estou testando o algoritmo com a seguinte modificação, para ve se o resultado irá mudar
Pasei o File e os Input para fora do while, assim tento simplificar as instanciações, vendo se irá mudar algo no resultado e no desempenho…

 File labels = new File(arquivo2);
            InputStream islabels = new FileInputStream(arquivo2);
            InputStreamReader isrlabels = new InputStreamReader(islabels);


            while (linha_queries != null) {



                BufferedReader brlabels = new BufferedReader(isrlabels);
                String linha_labels = brlabels.readLine(); //primeira linha do arquivo 2


                while ((linha_labels != null) && (linha_queries.equalsIgnoreCase(linha_labels) != true)) {

                    linha_labels = brlabels.readLine();

                }

.....

Ainda acho que trabalhar com listas seria mais rápido.

Diga me, o que seu código precisa exatamente fazer?

Precisa comparar dois arquivos? Use HASH.

Precisa saber se uma ou mais linhas de um arquivo existe em outro arquivo?

O que exatamente existe em “linha_queries”? Está sendo atualizado, para ler a proxima linha?

[quote=KamikazeBr]Diga me, o que seu código precisa exatamente fazer?

Precisa comparar dois arquivos? Use HASH.

Precisa saber se uma ou mais linhas de um arquivo existe em outro arquivo?

O que exatamente existe em “linha_queries”? Está sendo atualizado, para ler a proxima linha?[/quote]

Tenho dois arquivos

arquivo 1 -

obama family tree
french lick resort and casino
getting organized
toilet
AbbésS
mitchell college
kcs
air travel information

arquivo 2 -

Lorenza Bernot
List of celebrity guests on the Howard Stern show
Vasant Desai
Sant\u2019Angelo Lodigiano
That’s My Story - JLH Sings the Blues
KWRA-FM
Co-dependence

Devo pesquisar se no arquivo 1 tem ocorrência da mesma palavra no arquivo 2… se não, aplico outras tecnicas para dividir o arquivo 1 e procurar novamente no arquivo 2

Olha cara, eu na minha ignorância não vejo jeito melhor do que adicionar as linhas de cada arquivo em uma lista, tendo assim 2 listas, e percorrê-las como você faz atualmente com os arquivos.

Correr as listas vai ser mais rápido do que ler o arquivo toda vez.

Talvez algum ViniGodoy aí tenha uma ideia mais performática, provavelmente terá.

Também não entendi o objetivo, mas se realmente precisa encontrar um conteudo de um arquivo dentro do outro (grep), tem algumas maneiras de fazer isso que ficam mais rapidas!

De uma olhada nessa por exemplo:
http://www.java2s.com/Code/Java/Regular-Expressions/AnotherGrep.htm

Agora, se colocar na memória ou listas ajuda ou não, é meio relativo… se os arquivos forem muito grandes, imagina procurar uma linha em 100 arquivos, e cada arquivo destes tem 1gb com milhões de linhas… vai depender…

[quote=digaoneves]Olha cara, eu na minha ignorância não vejo jeito melhor do que adicionar as linhas de cada arquivo em uma lista, tendo assim 2 listas, e percorrê-las como você faz atualmente com os arquivos.

Correr as listas vai ser mais rápido do que ler o arquivo toda vez.

Talvez algum ViniGodoy aí tenha uma ideia mais performática, provavelmente terá.[/quote]

+1

Leia uma vez cada arquivo e trabalhe com as listas na memoria.
Até porque como você disse, se caso após sua primeira tentativa de comparações você teria que reler o arquivo.

PS: Quando você diz palavra, quer dizer uma frase completa?

Ate++

[quote=jmmenezes]…

Agora, se colocar na memória ou listas ajuda ou não, é meio relativo… se os arquivos forem muito grandes, imagina procurar uma linha em 100 arquivos, e cada arquivo destes tem 1gb com milhões de linhas… vai depender… [/quote]

Ele disse que o segundo while dele pode rodar 8 milhões de vezes, pra cada uma das 353 execuções do primeiro while, eu sinceramente não acho que ler o arquivo e carregá-lo em memória a cada vez, seja mais fácil do que ja ter tudo lá. Ainda mais julgando pelo tipo de pesquisa que ele faz, onde é difícil alguma coisa bater, por ter que comparar frases.

Como os dois arquivos não mudam, estou percebendo que será melhor jogar tudo para uma lista e trabalhar tudo em memória mesmo, tentarei aqui…

Abraços

[quote]

PS: Quando você diz palavra, quer dizer uma frase completa?

Ate++[/quote]

Isso!