Eliminar null de um ArrayList que contém Beans

13 respostas
Mannes
Olá pessoal do guj! Estou numa tarefa um tanto quanto difícil e desde já agradeço... Tenho um ArrayList list = new ArrayList(); e meuBean é assim:
public class meuBean {
	private String n_programa;
	private String n_pecas;
	private String n_ferramenta;
	private String tempoUso;
	private String data;
	private String ferramenta;
	
	public String getN_programa() {
		return n_programa;
	}
	public void setN_programa(String n_programa) {
		this.n_programa = n_programa;
	}
	public String getN_pecas() {
		return n_pecas;
	}
	public void setN_pecas(String n_pecas) {
		this.n_pecas = n_pecas;
	}
	public String getN_ferramenta() {
		return n_ferramenta;
	}
	public void setN_ferramenta(String n_ferramenta) {
		this.n_ferramenta = n_ferramenta;
	}
	public String getTempoUso() {
		return tempoUso;
	}
	public void setTempoUso(String tempoUso) {
		this.tempoUso = tempoUso;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public String getFerramenta() {
		return ferramenta;
	}
	public void setFerramenta(String ferramenta) {
		this.ferramenta = ferramenta;
	}
}
Bom, no desenvolver do software há 3 loops que preenchem este ArrayList... Mas no fim se esse for exibido fica assim: N_Programa | N_Peca | N_Ferramenta | TempoUso | Ferramenta ------3000--------65------------null-------------nulll------------null ------null---------null------------3----------------8--------------null ------null---------null------------null-------------null-------------84 ------null---------null------------null-------------null-------------3 ------null---------null------------null-------------null-------------98 ... -------------------------- e assim vai --------------------------

O 1º loop preenche as 2 primeiras colunas, o 2º loop preenche a 3 e 4, e o ultimo loop preenche soh a ultima, lembrando: cada linha é um bean(é esse o que está me dificultando)
Bom, os "nulls" que estão, digamos assim, acima da "diagonal principal"(mas isso não é uma matriz!) não devem existir, os que estão abaixo podem ficar lá.
Fiquei batendo minha cabeça por uma semana pensando em como tirar esse nulls
Eu sei que peguei pesado, me desculpem por isso, talvez vocês possam me dar uma sugestão...estou de mente aberta e agradeço novamente!

EDIT 1: os "nulls" acima da "diagonal principal" variam de acordo com os loops anteriores...

13 Respostas

Tiburcio_Mancha

Bom, pelo que entendi, a cada loop vc esta criando um objeto novo e inserindo no ArrayList…exemplificando, vc criou um objeto com as duas primeiras propriedades preenchidas e o inseriu…em seguida no segundo looping, vc criou um novo objeto, o anterior ja foi colocado no ArrayList…pos isso que esta dando os nuls nas propriedades…

Altere sua lógica e preencha todas as propriedades do objeto antes de inseri-lo…

Mannes

Tiburcio_Mancha, infelizmente não posso fazer isso, foi a primeira coisa que pensei, mas eu recebo esse Array assim, já populado estranhamente…
Estou trabalhando numa lógica muito comprida, acho que irá deixar meu programa muito lento… mas se funcionar eu postarei… por enquanto aguardo qualquer sujestão…
Muito obrigado Tiburcio_Mancha! mas como disse não sou eu quem popula esse array…mas é assim que ele faz o bean tem suas 5 posições,
No primeiro for ele preenche somente as primeiras, entao ele insere no array,
No segundo a 3 e 4, insere, e no ultimo a ultima “coluna” (ou propriedades, como vc escreveu…) e insere,
Verei se posso alterar essas inserções,… mas ficarei esperto a qualquer sugestão,

Obrigado novamente Tiburcio_Mancha!

Tiburcio_Mancha

não tem como vc criar um método para cada looping e vc ir passando o objeto para cada método, no final vc insere no ArrayList?

Porque se vc inserir no ArrayList no primeiro, o objeto que vc armazenar nos segundo será outro, assim como no terceiro…

Mannes

Acho que isso não iria funcionar, cada loop tem um numero de voltas diferente, são dois fors e um while.
Pelo menos da maneira que pensei não funcionaria…
Você conhece alguma forma de fazer algo assim:
1º loop 1º volta: meuBean.setN-programa
2º loop 1º volta: meuBean.setN-ferramenta
3º loop 1º volta: meuBean.setData
1º loop 2º volta: …
Entendeu certo? fazer um ciclo de cada loop por vez, eu pensei nisso antes, mas não faço idéia de como fazer, se você(ou alguém mais) souber eu aceitarei ajuda =D

EDIT 1: Porém vem aquela situação, o primeiro loop pode ser menor que o segundo… logo o segundo e o terceiro acabarão junto com o primeiro…não vai trazer o resultado correto!

Novamente, obrigado pela ajuda…

Tiburcio_Mancha

hum, não sei se comprendi corretamente, mas vc ta ligado no comandos break e continue???

eu num tenhu exemploa ki facil pra te mostrar, mas da uma olhada na net q ta cheio de exemplos?se entendi certo, break e continue resolvem seu problema

M

O que você gostaria que aparecesse no lugar de ‘null’?

Será que você não poderia setar uma valor padrão para as propriedades na classe meuBean (apesar que isso parece ir contra o princípio de Bean…).

Mannes

Poxa! Só agora notei que não revelei o que deve entrar no lugar de null!
Quero que os registros de baixo venham para cima, foi isso que eu quis dizer com eliminar os null,
Me desculpem :lol:=P

Bom, vou dar uma olhada no break e continue, eu já conhecia, mas como não domino muito bem(como assim não domina? que noob :D) nem pensei nessa solução.
Mas ainda acho que o primeiro loop sendo menor que os outros dois não irá funcionar, pois quando encerrar o primeiro os outros irão encerrar também, no máximo acho que dá para fazer-los darem mais uma volta…
Mesmo assim irei tentar implementar algo… muito obrigado a todos!
Continuo de mente aberta, qualquer sujestão é bem vinda… e postarei caso consiga algo…

Tiburcio_Mancha

então, da uma olhada, o break quando é chamado encerra o for e o continue quando chamado para a execução do código e inicia o looping seguinte

lina

Oi,

Realmente isso foi um pouco chato de fazer... Vou colocar o código, nele já tem os devidor comentários:

public final 
static Object ArrayRemoverNull(Object ao_source) {

     // Objeto para retornar o resultado ...
     Object
     lo_destine		=	null;
        	
     // Se é um array cujo tipo não é primitivo e diferente de nulo ...
     if (ao_source != null && ao_source.getClass().isArray() && !ao_source.getClass().getComponentType().isPrimitive())
     {
          // Variaveis de trabalho
          int ln_end = 0, ln_length = Array.getLength(ao_source);
                	
          // Cria uma área de trabalho ...
          lo_destine = Array.newInstance(ao_source.getClass().getComponentType(), ln_length);
        		
          // Copia todas as ocorrencias não nulas para o array de trabalho ...
          for (int ln_start = 0; ln_start < ln_length; ln_start++) {

               // Se não for nulo ...
               if (((Object[]) ao_source)[ln_start] != null)
               {
                    // Carrega no destino e  ajusta o tamanho ...
                    ((Object[]) lo_destine)[ln_end++] = ((Object[]) ao_source)[ln_start];
               }
          };

          // Se todo o array é nulo ...
          if (ln_end == 0) {
          
               // Retorna um array com nenhuma ocorrencia ...
	       lo_destine = Array.newInstance(ao_source.getClass(), 0);
          }
          // Se  alguma ocorrencia preenchida ...
          else {

               // Trunca o array ...
               lo_destine = ArrayTruncar(lo_destine, 0, ln_end);
          }
     }
        	
     // Retorna o array truncado ...
     return (lo_destine);
}

Vai precisar deste tbm:

public final 
static Object ArrayTruncar(final Object ao_source, final int an_start, final int an_end) {

     // Objeto para conter o objeto origem truncado ... 
     Object
     lo_destine = null;
        	
     // Se é um array e diferente de nulo ...
     if (ao_source != null && ao_source.getClass().isArray()) {

          // Se os indices dentro dos limites ...
          if (an_start >= 0 && an_start <= an_end && an_end <= Array.getLength(ao_source)) {

               // Cria o objeto a receber o array truncado ...
               lo_destine = Array.newInstance(ao_source.getClass().getComponentType(), an_end - an_start);
	        		
               // Copia o objeto origem truncando-o ...	       
               System.arraycopy(ao_source, an_start, lo_destine, 0, an_end - an_start);
          }
          // Se argumentos inválidos ...
          else {
               throw new IllegalArgumentException("Índices de inicio ("+an_start+") e/ou fim ("+an_end+") do array ("+Array.getLength(ao_source)+") a ser truncado inválido(s)");
          }
     }
      
     // Retorna o array truncado ...     
     return (lo_destine);
}

Tchauzin!

lina

Oi,

Aff não acredito! não é isso que você quer… rsrs! Esse método retira as posições nulas do Array…

Desculpe!

Tchauzin!

Mannes

:shock: Me desculpe, num entendi nada lina… sou muito iniciante em java, mas reparei que você passa um object como parametro e retorna um object também,

  1. Acho que se eu passar um arraylist vai funcionar, certo? 2. Ou devo transformar o array em Object(o que não faz sentido para mim)?
  2. Não há como retornar um arraylist? ou fazer algo depois do retorno e converter para arraylist?
    tipo assim:

Object obj = ArrayRemoverNull(meuArray); obj.toArray; // algo desse gênero
Bem, vou continuar olhando os breaks e continues…
Muito Obrigado, lina, por se esforçar tanto! E parabéns você é uma ótima programadora…
Aguardo as respostas…

EDIT 1: ouch…só agora vi seu ultimo post, poxa, me desculpe por não exemplificar corretamente…
EDIT 2: Pessoal, vou almoçar, vcs também deveriam, mas depois eu volto e dou uma olhada para ver o que vcs aprontaram, rsrs, estou pensando sériamente em refazer o método de inserção… depois do almoço irei trabalhar em cima dele, pensei vagamente em uma lógica que não irá inserir nada nulo… muito obrigado a todos que estão se esforçando! E desculpe por ser noob :frowning:

lina

Oi,

Então.. é pq eu fiz esse método para trabalhar de forma generica. Funcionando todos os tipos String[], int[] etc...

Para Array, deverá ser feito:
ArrayList
teste = new ArrayList();
teste.add(1);
teste.add(null);
teste.add(2);
teste.add(null);
teste.add(null);
teste.add(3);
		
for (int i = 0; i<teste.size(); i++) {
    System.out.println(teste.get(i));

    // VAI IMPRIMIR:
    // 1
    // null
    // 2
    // null
    // null
    // 3
}
		
System.out.println("-----------------------------");
		
Object[] receber_array = new Object[teste.size()];
		
teste.toArray(receber_array);
		
receber_array = (Object[]) VeSUtil.ArrayNullRemove(receber_array);
		
ArrayList sem_null = new ArrayList();
		
for (int i = 0; i < receber_array.length; i++) {
     sem_null.add(receber_array[i]);
     System.out.println(receber_array[i]);
     
     // VAI IMPRIMIR:
     // 1
     // 2  
     // 3 
}

Um pouco trabalhoso né! não pensei nisso direito rsrs.. Vou ver se conseguirei melhora-lo!

Tchauzin!

Mannes

Olá pessoal! Acho que este vai ser meu ultimo post deste tópico…heheh
Eu achei uma solução!
Conversei com algumas pessoas, e percebi que o modo de inserção dos beans dentro do ArrayList estava um tanto quanto esquesito(e errôneo), portanto arrumei a lógica dessa inserção para que não aparecesse os campos nulls
e o resultado na tela sai assim:
N_Programa | N_Peca | N_Ferramenta | TempoUso | Ferramenta
------3000--------65---------------1--------------78--------------12
------null---------null--------------3----------------8--------------32
------null---------null------------null-------------null-------------84
------null---------null------------null-------------null--------------3
------null---------null------------null-------------null-------------98

Agradeço a todos que me ajudaram, e infelizmente não pude contribuir com um código de RemoverNull, porém nossa moderadora lina postou dois códigos muito bons!
E a idéia do Tiburcio_Mancha foi muito boa também, não cheguei a implementá-la, mas se quiserem é só pedir…
Caso queiram algum código avise… não postei minha lógica de inserção agora porquê é muito extensa, peço que compreendam isso.
Qualquer coisa é só chamar(ou mandar uma PM :lol:=P)
Mais uma vez: Obrigado a todos!

Criado 14 de dezembro de 2009
Ultima resposta 14 de dez. de 2009
Respostas 13
Participantes 4