Hashmap para fila de Agência de banco - RESOLVIDO

6 respostas
BMuniz

Pessoal!

Preciso de uma ajuda de vocês, o problema que me foi passado é o seguinte:

Preciso fazer um “put” de várias pessoas em keys diferentes, exemplo:

Pessoa1, Pessoa2, Pessoa3 e Pessoa4.
cx1, cx2 e cx3.

cx1(Pessoa1)
cx2(Pessoa2)
cx3(Pessoa3)
cx1(Pessoa4)

O problema que ele imprime só último inserido naquela key.

Ai vai o código:

package br.ulbra.lpoo.filabanco;


import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class FilaBanco {
		int i;
		int j;
		HashMap<String, Pessoas> p = new HashMap<String, Pessoas>(); 
			
	public FilaBanco(){
		p.put("cx1" , new Pessoas("João",1));
		p.put("cx2" , new Pessoas("Maria",1));
		p.put("cx1" , new Pessoas("Paulo",2));
		p.put("cx3" , new Pessoas("Luis",1));
	}
	
	public void buscaFilasBanco(){
		/*Iterator<Pessoas> it = p.values().iterator();
		Iterator<String> it2 = p.keySet().iterator();
		Collection<Pessoas> p1 = new ArrayList<Pessoas>();
		Collection<String> p3 = new ArrayList<String>(); 
 		while(it2.hasNext()){
 			p3.add(it2.next());
 			for (Iterator i = p3.iterator(); i.hasNext();) {
 				Pessoas p2 = (Pessoas)i.next();
 				System.out.println(p2);
 				}
 		}
	*/
		
		Iterator itc = p.entrySet().iterator();
		while(itc.hasNext()){
			
			Map.Entry<String, Pessoas> conjunto = (Map.Entry<String, Pessoas>)itc.next();
			
			String key = conjunto.getKey();
			Pessoas p2 = conjunto.getValue();
			
						
			System.out.println("CAIXA = " + key );
			System.out.println(p2);
		}
		
	}
	
}

e imprime esse resultado:

CAIXA = cx1
 PESSOA = Paulo POSIÇÃO = 2
CAIXA = cx2
 PESSOA = Maria POSIÇÃO = 1
CAIXA = cx3
 PESSOA = Luis POSIÇÃO = 1

6 Respostas

Thiago_Peter

Você está usando um mapa, um mapa tem uma chave para um valor.
Você está utilizando a mesma chave ‘cx1’ e colocando outro objeto linhas 17 e 19.
Na hora de exibir ele vai mostrar o valor mais atual.

BMuniz

Thiago!

Quer dizer que não posso percorrer todos os itens daquela key. Não existe uma comparação com equals para diferencia-los. Eu havia ouvido alguma coisa sobre isso.

Vlw!!

fabim

So acrescentando, acho que o objeto mais interessante pra guardar as pessoas seria uma PriorityQueue, onde o primeiro a entrar (usando offer) é o primeiro a sair (usando pool), o tal do FIFO

BMuniz

Fabim!

Eu pensei nesta solução porém, o exercício do professor pedia em map. Eu tbm pensei em largar ele em um arraylist, mas, não consegui implementar.

Vlw!

Thiago_Peter

A chave é UNICA, como você está passando uma String como chave não há como fazer uma nova implementação de equals já que String é uma classe final.
Se você criar um novo mapa e utilizar outro objeto que você criou como chave aí sim você pode fazer a sua implementação de equals que irá definir se o objeto pode ser inserido no mapa.

BMuniz

Achei a solução:

Ai vai código:

package br.ulbra.lpoo.filabanco;



import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;


public class FilaBanco {
		
		List<Pessoas> cx1 = new ArrayList<Pessoas>();
		List<Pessoas> cx2 = new ArrayList<Pessoas>();
		List<Pessoas> cx3 = new ArrayList<Pessoas>();
		HashMap<String,Collection<Pessoas>> map = new HashMap<String, Collection<Pessoas>>();
		
		
		
			
	public FilaBanco(){
		System.out.println("Criando os caixas . . .");	
		map.put("cx1",cx1);
		map.put("cx2",cx2);
		map.put("cx3",cx3);
		System.out.println("Caixas criados . . .");
		
	}
	
	public void adicionaClienteFila(String n, int i){
		System.out.println("Inserindo o cliente na fila " + i);
		switch(i){
			case 1:{
					cx1.add(new Pessoas (n));
					break;	
			}
				
			case 2:{
				cx2.add(new Pessoas (n));
				break;
			}
			case 3:{
				cx3.add(new Pessoas (n));
				break;
			}
			default:{
					System.out.println("Não existe esta fila!");
			}
		}	
	}
	
	public void buscaFilasBanco(){
		Iterator itc = map.entrySet().iterator();			
			
 		while(itc.hasNext()){
 			Map.Entry<String, Collection<Pessoas>> it = (Map.Entry<String, Collection<Pessoas>>)itc.next();
 			String key = it.getKey();
			Collection<Pessoas> p2 = it.getValue();
			System.out.println("CAIXA = " + key );
			System.out.println(p2);
 		}
	}
	
	public void removeCliente(int i){
		System.out.println("Cliente da fila= " + i + " já foi atendido e será removido da fila");
		switch(i){
			case 1:{
					cx1.remove(0);
					break;
			}
			case 2:{
				
					cx2.remove(0);
					break;
			}
			case 3:{
				
					cx3.remove(0);
					break;
			}
			default:{
					System.out.println("CAIXA INVALIDA, NÃO FOI POSSÍVEL A EXCLUSÃO!");
			}
					
				
		}
		System.out.println("Cliente removido! ");
	}
}

Valeu pela força da gurizada!

Criado 7 de novembro de 2008
Ultima resposta 7 de nov. de 2008
Respostas 6
Participantes 3