Comparação entre listas[RESOLVIDO]

E aí galera?

Preciso manipular mais de uma List e emparelhá-las para que os tipos de informações fiquem equivalentes na mesma posição em cada List.

Entenderam? Não? Vamos lá…

List a = {maça, 20, vermelha}
onde na posição 0 temos o tipo da fruta, na posição 1 a quantidade, na posição 2 a cor
List b = {laranja, brasileira, 32, laranja}
onde na posição 0 temos o tipo da fruta, na posição 1 a nacionalidade, na posição 2 a quantidade e na posição 3 a cor

Tenho que fazer uma lógica que deixe estas duas listas assim:

[quote] ATRIBUTO-------| Lista | Listb-|
Tipo da fruta----|-----maça------| laranja---------|
Nacionalidade—|-----------------| brasileira------|
Quantidade------|-----20---------| 32--------------|
Cor---------------|----vermelho–|--laranja--------|[/quote]

Percebam que onde encontrarmos um atributo em uma lista e não encontramos na outra, na lista onde este atributo não existe a posição deve ser deixada em branco (ou null);
A lógica deve estar preparada para receber de 2 a mais listas…

Ajuda é bem vinda!!!

Abraços

faça um objeto fruta com todos os seus atributos, depois crie as 2 listas e vá adicionando os objetos nelas, o que não tiver ele vai ficar null mesmo, depois varra as listas comparando os objetos que elas contém…

OK, mas preciso não serão apenas duas listas.
Podem ser duas, três ou quatro listas para exibir na mesma tabela como comparativo

Oi!

O mais simples, na minha opinião, é implementar o Comparator, assim, podes utilizar o método sort da Collections, que lhe fará todo o “serviço”.
A ideia de criação de um objeto é interessante, mas não seria um objeto “fruta”, mas podes criar um Enum, por exemplo, ou simplesmente um objeto com dois campos, uma inteiro e uma String.

No campo inteiro um “type”, onde você vai definir o tipo de informação, e o String, onde será o valor em si.
Por exemplo:

1 - Fruta
2 - Quantidade
3 - Cor
4 - Qualquer

Assim, você consegue organizar sua lista perfeitamente, duas ou mais, inclusive.
O método sort da classe Collections implementa um Comparator, segue exemplo aqui

Abraços.

vc vai ter que fazer um método que compara estas listas meio genérico…
uma ideia que é meio cabulosa mas que de pra fazer, é, depois de adicionado o objeto na lista, vc pegue esta lista e adicione em outra, depois no método nos laços, vc vai saber quantas listas vai ter e vai ir conseguindo comparar todas as listas…

Qual a diculdade ?

Não somente isso, o porque de não utilizar o Comparator, como citei?

@nel
Estou testando sua sugestão que parece ser a mais coerente para este caso.
Só mais alguns minutos e posto meus resultados.

:slight_smile:

Caso esteja ok, coloque um resolvido no tópico.

Abs,

ok,

Criei uma classe de comparação


import java.util.Comparator;

import br.com.xxxxx.vo.FrutasVO;


public class ComparaLista implements Comparator<FrutasVO>{

	@Override
	public int compare(FrutasVO fruta1, FrutasVO fruta2) {  
		return fruta1.getNomeFruta().compareTo(fruta2.getNomeFruta());
	}

}

Na minha classe atual:

...

	ComparaLista comparaLista = new ComparaLista();
							Collections.sort(tipoFiltroComFrutas.getListItens(), comparaLista);
...

Desta forma consigo manter minhas listas de Frutas ordenadas por ordem alfabéticas.

Mas e quando uma das listas não tiver um dos atributos, se não tiver nacionalidade por exemplo? Preciso deixar esta posição nula para que a exibição da tabela fique correta

oi kra,

talvez seja melhor você usar um Array com 2 ou mais dimensões. Fazer a lógica de preenchimento e depois você gerar a lista. entendeu?

Oi!

Qual o contéudo da sua VO?
E veja, você está levando como critério para ordenação, exclusivamente o nome da fruta, você deve ficar atento as suas necessidades.
Para o seu caso, não basta comparar somente o nome, há outro atributos a serem comparados antes de retornar um determinado valor, perfeito?

Poste o seu objeto VO.
Ainda aconselho a usar apenas os dois parametros com indiquei, “type” e “value”.
Abraços.

import java.util.Comparator;

import br.com.xxxxx.vo.FrutasVO;  


public class ComparaLista implements Comparator<FrutasVO>{

	@Override
	public int compare(FrutasVO fruta1, FrutasVO fruta2) {  
                if(fruta1.getNomeFrute() == null && !fruta2.getNomFruta() != null){
                     return 1;
                }
		return fruta1.getNomeFruta().compareTo(fruta2.getNomeFruta());
	}

}

Nessa considerei que as frutas com nome null serão maiores e devem ser listadas primeiro.
vc tem que fazer as comparações se forem ambas null retorna 0 e se fruta1 for != null e fruta2 == null (inverso do if) vc retorna -1.

ai vai de seu criterio os retornos.

a grosso modo seria assim:
List lista1 = new ArrayList();
lista1.add(“maçã”);
lista1.add(“laranja”);

List lista2 = new ArrayList();
lista2.add(null); //valor nulo
lista2.add(“brasileira”);

List lista3 = new ArrayList();
lista3.add(“20”);
lista3.add(“32”);

Esse é o objetivo que você quer alcançar?
você precisaria adaptar o código para torna-lo dinâmico.

@nel

Segue o meu objeto VO

@Entity
@Table(name = "FRUTAS")
public class FrutasVO extends FeiraVO<Long> {

	
	@Id
	@Column(name = "cod_filtro", length = 50)
	private Long codigo;
	
	@Column(name = "str_nome", length = 1024)
	private String nomeFiltro;
	
	@ManyToOne
	@JoinColumn(nullable = false) 
	private TipoFrutaVO tipoFruta;

....Getters and Setters

tuas frutas são persistidas no Banco de Dados ???

Acho melhor refazer o tópico e renmontar as dúvidas dizendo a tua necessidade, todo mundo já viu que tentaste, porém pra mim está confuso…

Usou Objeto, usou Enum + Comparable, usou Array de String como estavas pensando ???

Enfim…

@brauliofreire

Me parece que o Felagund postou vai funcionar, vou fazer uns testes e já dou um retorno

Valeu!!

@adriano_si

As frutas são persistidas sim, mas a ordenação que estou buscando não será persistida. Apenas quando exibo a tabela de frutas na tela busco esta informação do BD, como são diversas frutas, preciso fazer esta lógica para emparelhar as informações e exibir na tela como mostrei na abertura do tópico…

hum… saquei…

o Comparator resolve definitivamente o teu problema…

Abs []

Pessoal,

Vocês estão me ajudando bastante mais ainda não consegui fazer o que preciso.

Vou explicar melhor a situação:

Eu já tenho as listas de frutas preenchidas e quero fazer uma tabela comparando os atributos de cada fruta.

O que eu preciso é fazer tipo um “merge” mas ao invés de pegar a informação que não tem um uma lista e copiar na outra, só preciso deixar a posição equivalente com valor null

Como estou exibindo a tabela hoje

[quote]ATRIBUTO-------| Lista | Listb-|
Tipo da fruta----|-----maça------| laranja---------|
Nacionalidade—|-----20---------| brasileira------|
Quantidade------|----vermelho–| 32--------------|
Cor---------------|-----------------|–laranja--------|
[/quote]

Como eu preciso exibir

[quote]ATRIBUTO-------| Lista | Listb-|
Tipo da fruta----|-----maça------| laranja---------|
Nacionalidade—|-----------------| brasileira------|
Quantidade------|-----20---------| 32--------------|
Cor---------------|----vermelho–|--laranja--------|[/quote]