Ajuda com lógica!

6 respostas
rafaelrodrigues1607

Tudo bem pessoal?!

Gostaria da ajuda de vocês para otimizar uma lógica que eu fiz aqui:

Tenho uma entidade chamada "Tempo" com dois atributos: "tempoConcentracao" e "precipitacao".
Quando eu encontrar valores IGUAIS para o atributo "tempoConcentracao", eu faço o somatório do atributo "precipitacao".
O código abaixo está funcionando, mas o tamanho do meu List de "Tempo" é de 759 mil. Está demorando muito!!!

public void somatorio(List<TempoConcentracao> listTC){

       for(TempoConcentracao tc : listTC){
            
            for(TempoConcentracao tc2 : listTC){
                
                if(tc2.getTempoConcentracao() == tc.getTempoConcentracao()){                                           
                        soma = soma + tc2.getPrecipitacao();                                                            
                }
            }            
        }
}

Uma ajudinha por favor!!!

6 Respostas

fabriciov

Você pode criar 2 ou mais lista iguais, dividir o trabalho e disparar algumas threads.
So tem que tomar bastante cuidado com os nullpointer e deixar o programa thread safe.

ex:
thread 1 : 0-249
thread 2 : 250-499
thread 3 : 500-750

claro que deve ter outras alternativas, mas foi a unica que me veio a mente :slight_smile:

edit: caso você precise entrar apenas uma vez no “if” poderia usar um break.

ViniGodoy

Por favor, ao postar tópicos, dê títulos descritivos. O título “Ajuda com lógica!” não dá qualquer dica do conteúdo do tópico e, portanto, é completamente inútil.

Sua lógica está estranha. Da forma que está, se você tem os tempos concentração A e o B você vai somar 2 vezes, uma quando a lista percorrer o A, outra quando percorrer o B. Provavelmente você poderia alterar sua lógica para realizar essa operação uma vez só, somando os dois valores. Isso reduziria pela metade o tempo para percorrer uma das listas.

xandevieira

A variável “soma” esta declarada onde?
Creio que o uso de

Map&lt;TempoConcentracao, Double&gt; mapTempoConcentracao = new HashMap&lt;TempoConcentracao, Double&gt;();

resolva seu problema.

G

ViniGodoy:
Por favor, ao postar tópicos, dê títulos descritivos. O título “Ajuda com lógica!” não dá qualquer dica do conteúdo do tópico e, portanto, é completamente inútil.

Sua lógica está estranha. Da forma que está, se você tem os tempos concentração A e o B você vai somar 2 vezes, uma quando a lista percorrer o A, outra quando percorrer o B. Provavelmente você poderia alterar sua lógica para realizar essa operação uma vez só, somando os dois valores. Isso reduziria pela metade o tempo para percorrer uma das listas.

ainda tem o prob de

tc2 == tc

E

Queria saber mais um detalhe do seu problema. Vou fazer uma tabelinha pequena e quero saber qual é o valor esperado para a variável “soma”.

Tempo Concentracao | Precipitacao
-------------------+-------------
      10           |     5
      11           |     2
      10           |     7
      12           |     3
      11           |     2
      10           |     9
-------------------+-------------

Qual o valor esperado para “soma”?

a) 5 + 7 + 9 + 2 + 2 (os valores de precipitação para 10, e os valores de precipitação para 11)
b) 7 + 9 + 2 (do segundo ao último valor de precipitação para 10, e do segundo ao último valor de precipitação para 11)
c) 2 + 2 (a soma das precipitações para o maior tempo de concentração)

Note que seu código não faz nenhuma das coisas acima (ele calcula 3 * (5 + 7 + 9) + 2 * (2 + 2) + 3 - ele considera o valor 12 que é único, e pelo que você disse, esse valor não é único. ).

E

Se for minha alternativa a) a correta, então se sua lista tiver poucos elementos repetidos, pode inverter o problema (achar apenas os elementos únicos, e descontar os valores de precipitação da soma de todas as precipitações. )

Criado 7 de agosto de 2012
Ultima resposta 7 de ago. de 2012
Respostas 6
Participantes 6