Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

andrea cerqueira

Comparar key de uma array list

Recommended Posts

Comecei a aprender java tem algumas semanas, e minha dúvida é bem idiota, mas não consegui resolver.

 

Eu tenho uma arrayList com os dados de algumas pessoas e um dos dados é se a pessoa é casada.

 

Quero imprimir a arrayList com todas as pessoas casadas, mas preciso verificar se o conjuge já foi listado, caso contrario a pessoa é listada duas vezes, pq lista ela e depois lista ela novamente por ser conjuge da primeira pessoa listada.

 

fiz um loop mas não consegui fazer a verificação na arrayList:

 

for (int i = 0; i < pessoas.size(); i++) {  
   if (pessoas.get(i).conjuge != null) {  
       System.out.println(pessoas.get(i).nome + " e " + pessoas.get(i).conjuge.nome + " são casados!!!");  
   }  
} 

 

Alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma possível estratégia é usar qualquer implementação de Set. Uma opção é HashSet. Sets são 'conjuntos', e seguem a definição matemática de que um conjunto não possui elementos repetidos.

 

o lance é que não tem repetido, é assim:

[]  -  |  nome  |  conjuge  |   pai  |  mae
0      | andrea |  alex     | joao   | vera
1      | alex   |  andrea   | flavio | therezinha
2      | joao   |  vera     | miguel | perla
3      | vera   |  joao     | joão   | emilia

 

eu quero imprimir a lista de casados, e vai sair repetido, pq andrea é casada com alex que obviamente é casado com andrea, então vai imprimir duas vezes entende?

 

resolvido:

 

for (int i = 0; i < pessoas.size(); i++) {
// se a pessoa for casada
if (pessoas.get(i).conjuge != null) {
	boolean achouConjuge = false;
	// dá um loop novamente pra não repetir casamentos
	for (int j = 0; j < i; j++) {
		// se o conjuge for a pessoa do loop, seta achouConjuge como true e para o loop
		if (pessoas.get(i).conjuge == pessoas.get(j)) {
			achouConjuge = true;
			break;
		}
	}
	// se o conjuge foi achado continua o loop principal
	if (achouConjuge) {
		continue;
	}
	System.out.println(pessoas.get(i).nome + " e " + pessoas.get(i).conjuge.nome + " são casados!!!");
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E minha recomendação se mantém: ao preencher a lista de pessoas, insira-as todas em uma implementação de Set. O Set usado vai ignorar inserções de elementos repetidos -- ele vai garantir a não-duplicação para você. Exemplo:

 

import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;

public class Teste
{
   public static void main(String args[])
   {
List<String> pessoas = new ArrayList<String>();

pessoas.add("Guilherme");
pessoas.add("Guilherme"); // pessoa duplicada
pessoas.add("Juliana");
pessoas.add("Pedro");
pessoas.add("Cesar");

for (String pessoa : pessoas)
{
    System.out.println(pessoa);
}

System.out.println("\n\tConstruindo lista sem pessoas repetidas:");

// O Construtor abaixo ignora as ocorrências repetidas do
// ArrayList com pessoas
Set<String> unicas = new HashSet<String>(pessoas);

for (String pessoa : unicas)
{
    System.out.println(pessoa);
}

   }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

E minha recomendação se mantém: ao preencher a lista de pessoas, insira-as todas em uma implementação de Set. O Set usado vai ignorar inserções de elementos repetidos -- ele vai garantir a não-duplicação para você. Exemplo:

 

import java.util.Set;
import java.util.HashSet;
import java.util.List;
import java.util.ArrayList;

public class Teste
{
   public static void main(String args[])
   {
List<String> pessoas = new ArrayList<String>();

pessoas.add("Guilherme");
pessoas.add("Guilherme"); // pessoa duplicada
pessoas.add("Juliana");
pessoas.add("Pedro");
pessoas.add("Cesar");

for (String pessoa : pessoas)
{
    System.out.println(pessoa);
}

System.out.println("\n\tConstruindo lista sem pessoas repetidas:");

// O Construtor abaixo ignora as ocorrências repetidas do
// ArrayList com pessoas
Set<String> unicas = new HashSet<String>(pessoas);

for (String pessoa : unicas)
{
    System.out.println(pessoa);
}

   }
}

 

vou testar essa forma tb, mas eu precisava mesmo em arrayList pois é um exercicio da facul.

abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde a todos.

 

Percebo aqui o que não foi observado é que você está trabalhando com 4 (quatro) atributos ou campos, como preferir, que são "nome", "conjuge", "pai" e "mãe".

 

Só que o List é uma interface que tem que ser implementada pela classe ArrayList e ambos armazenam arrays unidimensionais, ou seja, só armazena um único valor do tipo Object,

 

Ora se List e ArrayList armazena um array unidimensional do tipo Object, então este Object pode ser outro vetor de Strings, não pode wink.gif.

 

Então o código de armazenagem ficaria assim:

 

 ArrayList<String[]> pessoas = new ArrayList<String[]>();

 String[] familia = new String[]{"Andrea","Alex","João","Vera"};
 pessoas.add(familia);

 familia = new String[]{"Alex","Andrea","Flavio","Terezinha"};
 pessoas.add(familia);

 familia = new String[]{"João","Vera","Miguel","Perla"};
 pessoas.add(familia);

 familia = new String[]{"Vera","João","João","Emilia"};
 pessoas.add(familia);

 

No entanto, o que está te interessando na pesquisa, é saber se uma pessoa é casada, e se o nome dela não estará repetida entre os conjuges, assim sendo voce vai trabalhar apenas com os valores do índice 0 e 1 do vetor de strings, e o melhor jeito de fazer é colocar os nome e o seu conjuge tudo misturado numa cadeia de string e depois verificar se os nomes não estão dentro da cadeia, com o método indexOf da classe String, o seu código então fica assim:

 


import java.util.ArrayList;
import java.util.Iterator;

public class TesteArrayConjuge {

   public static void main(String[] args) {

       ArrayList<String[]> pessoas = new ArrayList<String[]>();

       String[] familia = new String[]{"Andrea","Alex","João","Vera"};
       pessoas.add(familia);

       familia = new String[]{"Alex","Andrea","Flavio","Terezinha"};
       pessoas.add(familia);

       familia = new String[]{"João","Vera","Miguel","Perla"};
       pessoas.add(familia);

       familia = new String[]{"Vera","João","João","Emilia"};
       pessoas.add(familia);

       String nomes = "";

       Iterator I = pessoas.iterator();
       while (I.hasNext()){
           String[] fam = (String[])I.next();
           if (!fam[1].equals("")){
               if (nomes.indexOf(fam[0]) < 0 || nomes.indexOf(fam[1]) < 0){
                    System.out.println(fam[0]+" e "+fam[1]+" são casados");   
                   nomes += fam[0] + fam[1];
                }
           }
       }   	
   }
}

 

ou ainda, na pesquisa, voce pode seguir a idéia do nosso amigo Guidjos, com os conjuntos, assim:

 


       Set<String> nomeunico = new HashSet<String>();
       Iterator I = pessoas.iterator();
       while (I.hasNext()){
           String[] fam = (String[])I.next();
           if (!fam[1].equals("")){
               if (!nomeunico.contains(fam[0]) || !nomeunico.contains(fam[1])){
                	System.out.println(fam[0]+" e "+fam[1]+" são casados");
                	nomeunico.add(fam[0]);
                	nomeunico.add(fam[1]);   
               }
           }
       }   	
   }

É claro que este foi o jeito mais grosseiro de se fazer este teu exercício, meio que na gambiarra, contudo, o jeito melhor e mais prático e mais aconselhável e criar uma classe Familia, e colocar seus atributos lá dentro e armazenar no ArrayList que armazena um object do tipo Familia. Porém não sei se voce já entrou na aula sobre conceitos de Orientação a Objetos, e se entrou e quiser o exemplo, post então o pedido aqui, que nós te ajudamos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.