Otimização de código [RESOLVIDO]

10 respostas
B

To com umas dúvidas aqui, não sei mais o que eu posso fazer pra otimizar esse código.. quem sabe tentar deixar apenas com UM for

for (int i = 0; i < jTable1.getRowCount(); i++) {

            email = (String) jTable1.getModel().getValueAt(i, 4);

            if (!listaEmail.contains(email)) {
                listaEmail.add(email);
            }
        }

        for (int i = 0; i < listaEmail.size(); i++) {
            
            vendValido.add(listaEmail.get(i));

            for (int l = 0; l < jTable1.getRowCount(); l++) {

                if (jTable1.getValueAt(l, 4).equals(listaEmail.get(i))) {
                    cliValidos.add(jTable1.getValueAt(l, 1) + "");
                }
            }

            System.out.println("\nVendedor: "+ vendValido);
            System.out.println("Cliente(s): "+ cliValidos);
            
            vendValido.clear();
            cliValidos.clear();
        }

se alguém puder me ajudar, valeu

10 Respostas

ViniGodoy

O que esse programa faz… exatamente? Pode explicar o raciocínio?

B

Seleciona através da tabela o vendedor e seus respectivos clientes.
ex. Quando o email de um vendedor (coluna 4) entrar no laço, preciso mostrar quais são seus clientes (coluna 1).

ViniGodoy

Faça assim:

private static final int COL_EMAIL_VENDEDOR = 4;
private static final int COL_CLIENTE = 1;

private Map<String, Set<String>> emails = new TreeMap<String, Set<String>>();

public Map<String, Set<String>> recuperarEmails() {
   for (int i = 0; i < jTable1.getRowCount(); i++) {
      //Pegamos o e-mail do vendedor
      String emailVendedor =  (String) jTable1.getModel().getValueAt(i, COL_EMAIL_VENDEDOR);
      //Buscamos a lista associada a esse e-mail.
      Set<String> clientes = emails.get(emailVendedor);
      //Caso ela ainda não exista (primeiro cliente desse vendedor), criamos uma lista
      //e já associamos a lista a esse e-mail.
      if (clientes == null) {
         clientes = new TreeSet<String>();
         emails.put(emailVendedor, clientes);
      }

      //Então, adicionamos na lista do vendedor o nome do cliente.
      clientes.add( (String) jTable1.getModel().getValueAt(i, COL_CLIENTE));
   }   
}

Isso gerará um mapa, que associa o e-mail do vendedor, a uma lista de clientes, daquele vendedor.
Tanto o mapa, quanto a lista são ordenados em ordem alfabética, e não admitem repetições.

Isso evita o uso do contains, já que impede naturalmente duplicatas. Fora que a performance será próxima de O(N). Centenas de vezes melhor que o seu algoritmo.

Outra coisa. Procure dar nomes descritivos para suas variáveis: tblVendedores (ou tblClientes, sei lá) seria um nome muito melhor que jTable1. Além disso, sempre crie nomes para suas constantes. Até pq, vc terá muito trabalho de alterar o código, caso o seu cliente peça para excluir uma coluna, e o número da coluna 4 vire 3, por exemplo. Com constantes, você só altera em um único lugar, além de deixar seu código muito mais legível.

B

saida:

[[email removido]]
[Cliente a]
____
[[email removido]]
[Cliente a, Cliente b]
____
[[email removido]]
[Cliente a, Cliente b, Cliente c]
os clientes são inseridos um a um.. como resolver isso ?

Muito obrigado Vini, vou estudar TreeSet (nunca tinha visto antes)
e dicas anotadas

edmarr

Hum De uma lida neste link
creio q vai lhe ajudar
a esclarecer

http://javafree.uol.com.br/artigo/847654/

ViniGodoy

Adicionei comentários no código ali de cima, para você entender melhor o que está acontecendo.

Para imprimir a saída daquele meu código ali:

Map<String, Set<String>> clientes = recuperarEmails();
for (String vendedor : clientes.keySet()) {
   System.out.println();
   System.out.println("Vendedor: "+ vendedor);  
   System.out.println("Cliente(s): "+ clientes.get(vendedor));
}
B

Excelente

ViniGodoy

Conseguiu usar?

B

Consegui sim !
E com esse ultimo forEach pude entrar no laço e enviar um email para cada vendedor mostrando todos seus clientes.
Sobre as dicas de colocar nome nas constantes, antes mesmo de terminar o projeto tive que modificar as colunas… facilitou muito !

Obrigado Vini.

ViniGodoy

Beleza, o próximo passo é aprender a trabalhar corretamente com o JTable, e fazer seu próprio TableModel.

O DefaultTableModel tem uma série de problemas, e dificulta muito a manipualação das tabelas. Talvez o seu sistema já seja baseado no Default, mas nada impede que novas tabelas sejam construídas com um model correto.

Criado 2 de dezembro de 2009
Ultima resposta 4 de dez. de 2009
Respostas 10
Participantes 3