Ajuda em projecto (tipo contact book)

29 respostas
L

Boas,

É o seguinte, eu estou fazendo um projecto na faculdade em que tenho que criar um programa que cria utilizadores(nome e coordenadas de localização) e que associa outros utilizadores como contactos, para que os mesmos possam enviar convites de eventos aos seus contactos. Eu já tenho uma boa parte feita mas estou com um problema na Main(). Vou deixar aqui um pequeno resumo das classes já criadas:

Utilizador; //Cria os utilizadores e os seus atributos.

ListaDeUtilizadores; //Lista os diferentes utilizadores em vector.

Contacto; //Cria o contacto e os seus atributos.

ListaDeContactos //Lista que define para cada utilizador quais dos outros utilizadores são seus contactos. Ex: Utilizador1 tem Utilizador2/3/4 como contactos (mas isto não obriga os outros utilizadores a terem o 1 como contacto)

Main;

O meu problema é o seguinte, após criar vários utilizadores como posso fazer para mete-los como contactos uns dos outros? Ou seja criar uma lista de contactos para cada utilizador.

Obrigado!

29 Respostas

guilhermehkr

Boa tarde,

Eu não entendi direito, por isso a pergunta: Um utilizador também é um contato?!
São objetos diferentes?!

Tem como você colocar a sua classe para ficar claro quem é quem ?!

Abraços

L

Sim, no inicio criamos vários utilizadores e depois podemos fazer com que o utilizador x seja contacto do utilizador y.

public class ListaDeUtilizadores {

private static final int MAX_CONTACTS = 15;

private int counter;
private Utilizador[] utilizadores;
private int currentUtilizador;

public ListaDeUtilizadores(){
	counter = 0;
	utilizadores = new Utilizador[MAX_CONTACTS];
	currentUtilizador = -1;
}

public boolean hasNext(){
	  return ((currentUtilizador >= 0 ) &&
	              (currentUtilizador < counter));
}

public boolean hasUtilizador(String name) {
	  return ( searchIndex(name) >= 0 );
}

public void initializeIterator(){
	currentUtilizador = 0;
}

public Utilizador next(){
	return utilizadores[currentUtilizador++];
}

public int getNumberOfUtilizadores(){
	return counter;
}

public void deleteUtilizador(String name){
	  utilizadores[searchIndex(name)] = utilizadores[counter-1];
	  counter--;
	}

public void addUtilizador(String name, String coordenadas){
	if (counter == utilizadores.length)
		resize();
	utilizadores[counter++] = new Utilizador(name, coordenadas);
}

 public void resize(){
	Utilizador tmp[] = new Utilizador[2*utilizadores.length];
	for (int i = 0; i < counter; i++){
		tmp[i] = utilizadores[i];
	}
	utilizadores = tmp;
}

private int searchIndex(String name){
	int i = 0;
	int result = -1;
	boolean find = false;
	while((i < counter) && (!find))
		if(utilizadores[i].getName().equals(name))
			find = true;
		else i++;
	if(find)
		result = i;
	return result;
	}

}

Aqui está a classe da lista de utilizadores, a classe lista de contactos é praticamente igual!

public class Utilizador {

private String name;
private String coordenadas;

public Utilizador(String name, String coordenadas){
	this.name = name;
	this.coordenadas = coordenadas;
}

public String getName(){
	return name;
}

public String getCoordenadas(){
	return coordenadas;
}

public boolean equals(Utilizador other) {
	  return this.getName().equals(other.getName());
}

}

E está á a classe do utilizador.

rodrigoblb

se for como eu entendi, você pode ter uma lista de Utilizador como atributo da classe Utilizador

public class Utilizador { 

private String name; 
private String coordenadas; 
private ArrayList<Utilizador> contatos;
 
public Utilizador(String name, String coordenadas){ 
this.name = name; 
this.coordenadas = coordenadas;
this.contatos = new ArrayList(); 
} 

public String getName(){ 
return name; 
} 

public String getCoordenadas(){ 
return coordenadas; 
} 

public void setContatos(Utilizador contato){
contatos.add(contato);
}

public ArrayList<Utilizador> getContatos(){
return this.contatos;
}

public boolean equals(Utilizador other) { 
return this.getName().equals(other.getName()); 
} 
}

assim você vai ter um array com todos os contatos do Utilizador.

L

Não percebi. Com esse array já posso adicionar por exemplo o utilizador y como sendo contacto do utilizador x?

rodrigoblb

Quando criar um Utilizador você vai ter um array onde você vai poder armazenar os Utilizadores que são contatos do seu Utilizador.

Por exemplo:

public class Main(){
   public static void main(String [] args){
      Utilizador x = new Utilizador("João", "asd");
      Utilizador y = new Utilizador("Maria","dsf");
      Utilizador z = new Utilizador("Rodrigo","xcz");

      /*digamos que os utilizadores y e z são contatos do utilizador x
         você adiciona os utilizadores y e z no array do utilizador x*/

      x.setContatos(y);
      x.setContatos(z);

    /*quando usar o getContatos você vai ter todos os contatos
       do utilizador*/

     ArrayList<Utilizador> contatosUtilizadorX = x.getContatos();
}

isso é um exemplo de abordagem,
espero ter ajudado, qualquer coisa é só falar :slight_smile:

guilhermehkr

Realmente se for um self join que deseja, o que o rodrigo escreveu esta certíssimo.

Este tipo de relação que deseja fazer, em banco de dados chama-se self join. Você deseja relacionar um registro com outro registro da própria tabela.

D

Contato e Utilizador têm os mesmo métodos? Pois pelo que eu entendi você quer colocar os utilizadores como contatos e depois criar um array de contatos. Mas se você colocar um array de contatos passando utilizadores não vai dar certo. Em utilizador você cria um ArrayList<Contacto> contactos = new ArrayList<Contacto>();

Aí sempre que você quiser armazenar um contato você faz um contactos.add(Aqui seu contato)

Lucas_Abbatepaolo

Uma lista ou array resolve seu problema…

já no caso da persistencia creio que não seja um self join ja que seu contato pode ter varios contatos…provavelmente vc terá que criar uma tabela n X n para armazenar…
[]'s

rodrigoblb

Verdade, não tinha visto que ele tinha criado uma classe Contacto.
Não sei bem como ele pensou a arquitetura do projeto dele, mas eu acho que ele não precisa da classe Contacto, a classe Utilizador
já é o suficiente.

L

Ok ja tou a compreender, digam me so uma coisa, com esse tipo de implementação eu posso fazer com que cada diferente utilizador tenha a sua lista de contactos independente da dos outros?

Exemplo: Utilizador 1 tem como contactos o utl 2, 3, 4 e 5.
Utilizador 2 tem como contactos o 3 e o 4.

rodrigoblb

Sim, cada utilizador vai ter sua própria lista de contatos (que é o array) independente da dos outros.

L

Ok esta tarde quando sair da faculdade vou implementar, qualquer problema venho aqui! Muito obrigado!

L

Estou com um problema! Ao tentar implementar esta parte:

nomeDoUtilizador.setContatos(nomeDoContacto);

dá erro pois o método não é definido para String. Nao me expliquei bem mas a unica coisa que se utiliza ao adicionar um contacto é o nome do mesmo e não o nome e as coordenadas. Por isso so preciso de adicionar uma string com o nome…

D
public class Utilizador {   
  
private String name;   
private String coordenadas;   
private ArrayList<Utilizador> contatos;  
  
public Utilizador(String name, String coordenadas){   
this.name = name;   
this.coordenadas = coordenadas;  
this.contatos = new ArrayList();   
}   
  
public String getName(){   
return name;   
}   
  
public String getCoordenadas(){   
return coordenadas;   
}   
  
public void setContatos(String contato){  
contatos.add(contato);  
}  
  
public ArrayList<Utilizador> getContatos(){  
return this.contatos;  
}  
  
public boolean equals(Utilizador other) {   
return this.getName().equals(other.getName());   
}   
}

Muda para isso. Mas o ideal seria salvar o objeto Utilizador para ter acesso a todas informações do contato.

rodrigoblb
public class Utilizador {     
    
private String name;     
private String coordenadas;     
private ArrayList<String> contatos;    
    
public Utilizador(String name, String coordenadas){     
this.name = name;     
this.coordenadas = coordenadas;    
this.contatos = new ArrayList();     
}     
    
public String getName(){     
return name;     
}     
    
public String getCoordenadas(){     
return coordenadas;     
}     
    
public void setContatos(String contato){    
contatos.add(contato);    
}    
    
public ArrayList<String> getContatos(){    
return this.contatos;    
}    
    
public boolean equals(Utilizador other) {     
return this.getName().equals(other.getName());     
}     
}

O ArrayList tem que ser de String :slight_smile:

Se você quiser acessar as informações do objeto é como o Danilo disse o ideal seria salvar o objeto Utilizador!

D

rodrigoblb:

O ArrayList tem que ser de String :slight_smile:

Se você quiser acessar as informações do objeto é como o Danilo disse o ideal seria salvar o objeto Utilizador!

Verdade nem tinha reparado no ArrayList

L

Eu ao criar o utilizador guardo as informações num array até porque tenho uma função para listar os utilizadores na consola listar os contactos, eventos…

L

Continuo a ter o mesmo problema:

public void CriarContacto(){
Scanner in = new Scanner(System.in);

String nomeDoUtilizador="";
	String nomeDoContacto="";
	nomeDoUtilizador=in.nextLine();
	nomeDoContacto=in.nextLine();
	if(lu.hasUtilizador(nomeDoUtilizador)==true{
		if(lu.hasUtilizador(nomeDoContacto) == true){
			nomeDoUtilizador.setContatos(nomeDoContacto);
		}
	}

O setContatos continua a dizer que nao está definido para string.

rodrigoblb

Mostra como esta a classe Utilizador!

L

import java.util.ArrayList;

public class Utilizador {

private String name;
private String coordenadas;
private ArrayList<String> contatos;  

public Utilizador(String name, String coordenadas){
	this.name = name;
	this.coordenadas = coordenadas;
	this.contatos = new ArrayList();
}

public String getName(){
	return name;
}

public String getCoordenadas(){
	return coordenadas;
}

public void setContatos(String contato){      
	contatos.add(contato);      
}      

public ArrayList<String> getContatos(){      
	return this.contatos;      
}

public boolean equals(Utilizador other) {   
	return this.getName().equals(other.getName());   
}

}

D

luiji1790
Não esqueça de colocar nas tags code fica mais fácil de ajudar

L

Qual é o codigo?

rodrigoblb

O erro é porque o método setContatos não é existe para objetos String, ele só existe para objetos do tipo Utilizador.

Para usar o setContatos foi tem que ter um objeto Utilizado, por exemplo:

public void CriarContato(){
Scanner in = new Scanner(System.in);

String nomeDoUtilizador = "";
String nomeDoContato = "";
nomeDoUtilizador = in.nextLine();
nomeDoContato = in.nextLine();

if(lu.hasUtilizador(nomeDoUtilizador) == true){
  if(lu.hasUtilizador(nomeDoContato) == true){
       Utilizador utilizador1 = new Utilizador(nomeDoUtilizador, "dsadsa");
       utilizador1.setContato(nomeDoContato);
  }
}

}
L

Agora é que fiquei mesmo confuso, eu so utilizo a classe Utilizador para criar os utilizadores e adiciona-los a um array na classe ListaDeUtilizadores.

L

Ajudem sff! Fiquei mesmo confuso, vou tentar explicar melhor a situação eu não posso utilizar o método array list porque ainda não o estudei na faculdade, o que eu quero é criar um array de contactos para cada utilizador. Tendo em atenção que os utilizadores tambem estão num array.

D

Só por que seu professor não ensinou não quer dizer que não possa usar. A não ser que ele tenha dito não utilizem ArrayList

L

É esse o problema! Eu mandei mail ontem com essa implementação e ele disse que so podemos utilizar materia dada na aula. Ajudem!

D

E o que você aprendeu até agora?

L

Classes Simples e Tipos Básicos de Dados, Condições e Decisões. Bloco de Instruções. Análise de especificações em língua natural e modelação de classes, Repetição de Comandos (iteração), Ficheiros(gravar, ler), Vectores, Vectores de objetos.

Criado 4 de janeiro de 2012
Ultima resposta 7 de jan. de 2012
Respostas 29
Participantes 5