Array list

11 respostas
protonfranklin

Boa noite,

Estou com um problema que está me intrigando. Eu tenho este método que alimenta uma grid mas estou encontrando o seguinte detalhe: Quando minha grid é populada é trazido o número de registros contidos na tabela, mas todos os registros estão se repetindo.
Na linha 44 executo este testes e minha lista vem com todos os registros normalmente, mas na linha 55 um único registro está se repetindo conforme a quantidade de registros eu tenha na tabela.

Caso alguem tenha alguma dica de como resolver, agradeço.

public List detalhesPedido(){
		
			HashMap hashMap = new HashMap();
			
			List listaDetalhes = new ArrayList();
			@SuppressWarnings("unused")
			StringBuilder retornoDetalhes = new StringBuilder();
			
			StringBuilder sqlConsulta = new StringBuilder();
			
			sqlConsulta.append(" SELECT ");
			sqlConsulta.append(" C.DEPOSITO AS DEP, ");
			sqlConsulta.append(" C.RUA AS RUA, ");
			sqlConsulta.append(" C.PREDIO AS PREDIO, ");
			sqlConsulta.append(" C.NIVEL AS NIVEL, ");
			sqlConsulta.append(" C.APTO AS APTO, ");
			sqlConsulta.append(" C.NUMOS AS NUMOS, ");
			sqlConsulta.append(" C.CODCLI AS CODCLI, ");
			sqlConsulta.append(" C.NOME_CLIENTE AS NOMECLI, ");
			sqlConsulta.append(" C.STATUS AS STATUS, ");
			sqlConsulta.append(" C.DATA  AS DATA");
			sqlConsulta.append(" FROM  ");
			sqlConsulta.append(" S_ARM_PEDIDO_CLI C ");
			
			try {
				
				conecta = new Conecta();
				conecta.conexao();
				conecta.resultSet = conecta.statement.executeQuery(sqlConsulta.toString());
	            
	            while(conecta.resultSet.next()){
	            	
	            	hashMap.put("DEP", conecta.resultSet.getString("DEP"));
	            	hashMap.put("RUA", conecta.resultSet.getString("RUA"));
	            	hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));
	            	hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));
	            	hashMap.put("APTO", conecta.resultSet.getString("APTO"));
	            	hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));
	            	hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));
	            	hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));
	            	hashMap.put("DATA", conecta.resultSet.getString("DATA"));
	            	
	            	listaDetalhes.add(hashMap);
	            	System.out.println(listaDetalhes);
	            	
	            }
	            
	            return listaDetalhes;
	            
			} catch (SQLException sql){
				
				System.err.println("SQL Incorreto: "+sql);
			}
			
			System.out.println(listaDetalhes);
			return listaDetalhes;
			
			
		}//Fim do método detalhePedido

11 Respostas

otaviojava

use Set colection ele não coloca valores iguais em sua lista.
Para que funcione corretamente basta sobrescrever os métodos equals e hascode de seu objeto.

protonfranklin

Não entendi resolução, você pode me passar um exemplo usando este código? O que achei estranho é que o teste dentro do laço while o valor da variável está correto mas no return não. Usa esse trecho de código e altera conforma a sua sugestão para que eu compreenda melhor.

Rodrigo_Sasaki

cara… não sei se é esse seu problema, mas você ta imprimindo tudo dentro do while… e imprime a lista toda vez… ou seja:

primeiro loop: adiciona um dado na lista e imprime a lista -> imprime um dado
segundo loop: adiciona um dado na lista e imprime a lista -> imprime dois dados (o primeiro que ja foi imprimido mais o segundo que foi adicionado neste loop)
terceiro loop: adiciona um dado na lista e imprime a lista -> imprime 3 dados(os 2 primeiros que ja foram imprimidos mais o terceiro que foi adicionado neste loop)

e por aí vai…

fica algo parecido com isso:

primeiro registro (resultado da impressão do primeiro loop)
primeiro registro (resultado da impressão do segundo loop)
segundo registro
primeiro registro (resultado da impressão do terceiro loop)
segundo registro
terceiro registro

se quiser imprimir uma vez só… ou coloque o método de impressão fora do loop, assim:

while (conecta.resultSet.next()) {

	hashMap.put("DEP", conecta.resultSet.getString("DEP"));
	hashMap.put("RUA", conecta.resultSet.getString("RUA"));
	hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));
	hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));
	hashMap.put("APTO", conecta.resultSet.getString("APTO"));
	hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));
	hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));
	hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));
	hashMap.put("DATA", conecta.resultSet.getString("DATA"));

	listaDetalhes.add(hashMap);

}
System.out.println(listaDetalhes);

ou imprima dentro do while somente o que foi adicionado naquele loop, assim:

while (conecta.resultSet.next()) {

	hashMap.put("DEP", conecta.resultSet.getString("DEP"));
	hashMap.put("RUA", conecta.resultSet.getString("RUA"));
	hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));
	hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));
	hashMap.put("APTO", conecta.resultSet.getString("APTO"));
	hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));
	hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));
	hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));
	hashMap.put("DATA", conecta.resultSet.getString("DATA"));

	listaDetalhes.add(hashMap);
	System.out.println(hashMap);
}

espero ter ajudado…

abraço!

arthurgon

O que você pode fazer é criar um hashSet no lugar da sua lista (List listaDetalhes = new ArrayList(); ). Dessa forma os objetos não se repetem na sua lista. Mas para funcionar é preciso sobrescrever os métodos hashCode e equals na sua classe representativa (VO), do contrário a lista não fará comparação com nada e continuará permitindo repetição.
Ah…e esse while também está estranho.
Espero ter ajudado.

otaviojava

Tem uma matéria legal falando sobre Collections nessa revista dá uma olhada.

http://www.devmedia.com.br/post-18452-Revista-Easy-Java-Magazine-1.html

Luiz_Aguiar

Tópicos com título em maiúsculo serão deletados!

protonfranklin

Pessoal com as dicas que vocês deram chequei a seguinte resolução que resolveu meu problema. Adicionei a linha 13 e o problema foi resolvido.

Obrigado a todos.

while(conecta.resultSet.next()){
	            	
	            	hashMap.put("DEP", conecta.resultSet.getString("DEP"));
	            	hashMap.put("RUA", conecta.resultSet.getString("RUA"));
	            	hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));
	            	hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));
	            	hashMap.put("APTO", conecta.resultSet.getString("APTO"));
	            	hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));
	            	hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));
	            	hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));
	            	hashMap.put("DATA", conecta.resultSet.getString("DATA"));
	            	
	            	hashMap = new HashMap();
	            	
	            	listaDetalhes.add(hashMap);
	            	
	            }
Rodrigo_Sasaki

alguém me corrija aí por favor se eu estiver errado…
mas parece que você ta adicionando tudo o que quer no HashMap, só que depois ‘limpa’ ele criando uma referência nova, e adiciona na lista… é isso?

ta adicionando objetos vazios na lista? ou eu que entendi errado?

Vingdel

Bom dia, protonfranklin!

Faça seu método assim, é parecido com o que o digaoneves falou, porém a maneira que ele sugeriu QUASE resolve o problema só no println(), ou seja, continua imprimindo errado.

O problema estava acontecendo quando você jogava o HashMap para dentro da List, pois ele ia se repetindo na List, como o digaoneves exemplificou, por exemplo:

LOOP 1:

HashMap: 1
Lista: 1

LOOP 2:

HashMap: 1, 2
Lista: 1, 1, 2

LOOP 3:

HashMap: 1, 2, 3 Lista: 1, 1, 2, 1, 2 ,3
while(conecta.resultSet.next()){

	hashMap.put("DEP", conecta.resultSet.getString("DEP"));
	hashMap.put("RUA", conecta.resultSet.getString("RUA"));
	hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));
	hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));
	hashMap.put("APTO", conecta.resultSet.getString("APTO"));
	hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));
	hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));
	hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));
	hashMap.put("DATA", conecta.resultSet.getString("DATA"));
  
}
listaDetalhes.add(hashMap);
System.out.println(listaDetalhes);
Veja o resultado da minha sugestão e me diga se resolve.

Abraço e boa sorte!

Rodrigo_Sasaki

Cara se vc precisa de uma lista de HashMaps você tem que fazer assim :

while(conecta.resultSet.next()){                      
                    hashMap = new HashMap();      

                    hashMap.put("DEP", conecta.resultSet.getString("DEP"));   
                    hashMap.put("RUA", conecta.resultSet.getString("RUA"));   
                    hashMap.put("PREDIO", conecta.resultSet.getString("PREDIO"));   
                    hashMap.put("NIVEL", conecta.resultSet.getString("NIVEL"));   
                    hashMap.put("APTO", conecta.resultSet.getString("APTO"));   
                    hashMap.put("CODCLI", conecta.resultSet.getString("CODCLI"));   
                    hashMap.put("NOMECLI", conecta.resultSet.getString("NOMECLI"));   
                    hashMap.put("STATUS", conecta.resultSet.getString("STATUS"));   
                    hashMap.put("DATA", conecta.resultSet.getString("DATA"));                          
                   
                    listaDetalhes.add(hashMap);   
                       
                }

fazendo assim a cada loop em que seu while da ele cria uma nova instancia para a variavel hashMap pega essas propriedades adiciona no hashMap e joga na lista.

R

oi ai esta meu codigo

import java.io.*;           
            import java.util.HashMap;    
            import java.util.ArrayList;      
            import java.util.List;      
            import java.util.Map;      
            //import javax.swing.JOptionPane;     
          
          
                         
          public class Dados{               
                       
                  
              //"args" é um array de String onde cada elemento é um argumento passado pela linha de comando momento na "inicialização" da execução.    
              public static void main(String[] args){               
                      
                      
                 Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                 //leitura do ficheiro, prepara-o para ser aberto    
                 BufferedReader in = new BufferedReader(new FileReader("conteudo.txt"));               
                 String str;           
                 int i = 0;           
                 //vai percorrer todo o ficheiro    
                 while((str = in.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))    
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings imprimindo o seu resultado    
                          List<String> values = new ArrayList<String>();         
                              String words[] = str.split(";");             
                              for(String word : words) {             
                                  values.add(word);     
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui     
                 //JOptionPane.showMessageDialog(null, this.word, "NÂO FOI POSSÍVEL ABRIR O SEU FICHEIRO", JOptionPane.ERROR_MESSAGE);      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");            
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 }         
             }                  
             }     
              public static void main2(String[] args){               
                      
                      
                  Map<Integer, List<String>> mapLines= new HashMap<Integer, List<String>>();         
               try {               
                            
                 BufferedReader in2 = new BufferedReader(new FileReader("conteudo2.txt"));               
                 String str;           
                 int i = 0;           
                 while((str = in2.readLine()) != null)               
                 {                     
                     if(str.startsWith("#"))                     
                     {                     
                         str= "";                     
                     }                     
                     else{     //esta a dividir a frase em varias strings    
                              List<String> values = new ArrayList<String>();         
                              String words[] = str.split(" ");             
                              for(String word : words) {             
                                  values.add(word);    
                                  System.out.println(word);    
                              }         
                              mapLines.put(i, values);         
                              i++;         
                     }       
               }// fim do while                               
                 in2.close();               
             }  catch (IOException e){               
                 // possiveis erros são tratatos aqui      
                 System.out.println("ERRO-->NÃO FOI ENCONTRADO O SEU FICHEIRO DE DESTINO,TENTE DE NOVO");    
             }          
             // Apresenta o contéudo do Map         
             Map<Integer, List<String>> m = new HashMap<Integer, List<String>>();         
             for(Integer key : m.keySet()) {         
                 for(String word : m.get(key)) {         
                     System.out.println(word);         
                 
                  }       
          
              }    
          }    
      }

e tenho por exemplo este ficheiro

961234567 253883377 24:05:2011 10:30:10 068 16 13    
       963456789 253883355 28:05:2011 12:15:17 088 12 09    
       963456789 253883377 29:05:2011 17:00:00 120 14 11    
       969876666 253883377 30:05:2011 10:05:34 070 11 09    
       961234567 253883377 31:05:2011 22:30:05 066 14 11    
       961234567 253883377 02:06:2011 14:19:41 076 15 13    
       963456789 253883377 05:06:2011 11:33:34 085 07 06

e queria que fosse pedido ao utilizador que dados e que ele quer imprimir. por exemplo...pedirmos para imprimir todos os dados com o numero 961234567

abraços

Criado 17 de maio de 2011
Ultima resposta 27 de jun. de 2011
Respostas 11
Participantes 7