Duvida sobre Java e Estrutura de Dados

13 respostas
L

Olá! Sou novo aqui no Fórum e não sou programador Java. Estou desenvolvendo um programa em C e em Delphi e estou com dificuldades para representar um sistema elétrico. Esse sistema é composto por vários nós, e esses nós podem estar ligados a qualquer um dos outros. Atualmente armazeno os nós em vetores. Os nós são estruturas, ou seja, compostos de vários campos. Existem campos que indicam as ligações desse nós com os outros (quais estão ligados a ele). Acontece que é complicado localizar um nó específico, ou mesmo remove-los. Existem também algumas situações especiais na remoção, como, por exemplo, se um nó for removido e acabar isolando outro, esse outro também deveria ser removido. A minha dúvida é se existem mais ferramentas em Java que facilitem o meu trabalho (em C tá bem complicado). O mais próximo que consegui para C foram Árvores Binárias, mas essas não são boas, pois como o próprio nome diz, só permitem duas ligações, o que não corresponde à minha representação. Além disso, árvores bínarias necessitam de funções recursivas, dificultando a visualização de erros. Agradeço a ajuda. Obrigado

13 Respostas

renzonuccitelli

Acho que vc deveria utilizar um grafo em vez de uma árvore. Leio sobre lista de adjacências e acho que vc vai resolver o seu problema.

is.matt.r

Já tentou ver lista encadeada!(de um apontar para o proximo e tal!)

L

Ae! Obrigado pela ajuda. Imagino que grafos seriam interessantes para mim, mas não tenho material de estudo. Onde posso obter boas informações sobre grafos?

Listas Encadeadas não conseguem representar o meu sistema… seria quase o mesmo que trabalhar com vetores, e ainda ter que correr perigo com o manuseio de ponteiros… assim como as funções recursivas, os ponteiros também geram erros difíceis de se detectar… só ultilizo ponteiros em parâmetros e retornos de funções, onde tenho melhor controle.

Existem API’s ou códigos em Java mais eficientes ou posso sair pelo C através da teoria dos grafos? Obrigado pela atenção =)

renzonuccitelli

Pelo que entendi da sua descrição, cada nó poderá receber várias ligações. Então vc vai ter que trabalhar com grafo, independente da linguagem de programação que vc vai utilizar. A Lista de adjacências eu usava na faculdade, eu só programava em C mesmo. Pode ser que C++ apresente alguma API para facilitar esse trabalho, ou Java. Se fosse pra fazer no braço em Java, eu criaria uma classe Nó que possui uma lista de outros nós.

renzonuccitelli

Vc também poderia criar um gerente de nós pra fazer as ligações e também pra manter referencia para todos os nós. Vc poderia fazer a remoção através dele, e assim poderia identificar facilmente nós isolados…

L

Isso, cada nó pode receber várias ligações =). Um… então preciso pesquisar sobre grafos… Como que funciona melhor esse “gerente de nós” ? Entendi a ideia, mas acho que não saberei implementar. Obrigado =)

renzonuccitelli

Olha, fiz um exemplo básico baseado na tua descrição. Obviamente que se for pra simular um sistema elétrico não vai servir, mas acho que da pra te dar uma idéia. Não me preocupei nada com arquitetura, se fosse pra fazer bonitinho eu faria um método pra criar os nós e já cadastrá-los automáticamente no gerente, entre várias outras coisas. Enfim, minha idéia foi de ter um gerente para manter referencia para todos os nós, facilitando percorrê-los para retirar os isolados. Eu considerei isolado aquele que não possui nenhuma ligação com outro nó. Então vão as classes:

public class Noh {
	private List<Noh> nohsVizinhos;
	private int indice;
	public Noh(int indice) {
		super();
		nohsVizinhos=new LinkedList<Noh>();
		this.indice=indice;
	}
	
	public void adicionarNohVizinho(Noh noh){
		nohsVizinhos.add(noh);
	}
	
	public void removerNohVizinho(Noh noh){
		nohsVizinhos.remove(noh);
	}

	public List<Noh> getNohsVizinhos() {
		return nohsVizinhos;
	}

	public int getIndice() {
		return indice;
	}
}
public class GerenteDeNohs {
	private Set<Noh> nohs;
	public GerenteDeNohs() {
		super();
		nohs=new HashSet<Noh>();
	}
	
	public void cadastrarNoh(Noh noh){
		nohs.add(noh);
	}
	
	public void adicionarLigacaoEntreNohs(Noh noh1,Noh noh2){
		noh1.adicionarNohVizinho(noh2);
		noh2.adicionarNohVizinho(noh1);
	}
	
	public void removerNoh(Noh noh){
		nohs.remove(noh);
		removerLigacoesComNohRemovido(noh);
		removerNohsIsolados();
	}

	

	private void removerNohsIsolados() {
		LinkedList<Noh> listaNohsIsolados=new LinkedList<Noh>();
		for(Noh n: nohs){
			if(n.getNohsVizinhos().size()==0){
				listaNohsIsolados.add(n);
			}
		}
		nohs.removeAll(listaNohsIsolados);
	}

	private void removerLigacoesComNohRemovido(Noh noh) {
		for(Noh n: nohs){
			if(n.getNohsVizinhos().contains(noh)){
				n.removerNohVizinho(noh);
			}
		}
	}

	public Set<Noh> getNohs() {
		return nohs;
	}
}

e vai o código pra testar se o gerente fez as ligações correntamente e a remoção também:

static public void main(String args[]){
		Noh noh1=new Noh(1);
		Noh noh2=new Noh(2);
		Noh noh3=new Noh(3);
		Noh noh4=new Noh(4);
		GerenteDeNohs gerente=new GerenteDeNohs();
		gerente.cadastrarNoh(noh1);
		gerente.cadastrarNoh(noh2);
		gerente.cadastrarNoh(noh3);
		gerente.cadastrarNoh(noh4);
		gerente.adicionarLigacaoEntreNohs(noh1, noh2);
		gerente.adicionarLigacaoEntreNohs(noh2, noh3);
		gerente.adicionarLigacaoEntreNohs(noh1, noh3);
		gerente.adicionarLigacaoEntreNohs(noh1, noh4);
		imprimirNohs(gerente);
		System.out.println("Remoção do nó 1");
		gerente.removerNoh(noh1);
		imprimirNohs(gerente);
		
	}
	
	static private void imprimirNohs(GerenteDeNohs gerente){
		for(Noh noh:gerente.getNohs()){
			System.out.printf("nó "+noh.getIndice()+" com vizinhos: ");
			for(Noh n:noh.getNohsVizinhos()){
				System.out.printf(n.getIndice()+",");
			}
			System.out.println();
		}
	}
renzonuccitelli

Mas só uma coisa cara, se vc nem sabia o que era um grafo, eu recomendo a vc estudar um pouco mais antes de programar. Isso porque grafo é assunto básico, visto em um curso de estruturas de dados básico. É bom saber sobre as estruturas antes de sair programando, ainda mais se vc for ter que usar uma estrutura que ainda não conhece…

renzonuccitelli

dá uma olhada nesse link

L

Olá! Obrigado pela atenção. Vou tirar esses dias para entender informações. Desculpa ae qualquer coisa, é que faço eng. elétrica e o foco em programação é pequeno… não tive aulas de Estruturas de Dados nem de Orientação a objeto… o pouco que sei aprendi batendo cabeça por fora =). Bom, mas é assim que as coisas funcionam… vou estudar aqui, acredito que em alguns dias eu volte com mais dúvidas =) Novamente, obrigado!

Outras pessoas que quiserem postar outros links fiquem a vontade =)

renzonuccitelli

Precisa pedir desculpa não cara, o que eu comentei sobre estudar mais só um toque, mas isso se vc tava pensando em fazer alguma coisa mais séria com computação. Mas então, se for pra simular um sistema elétrico, obviamente que o que fiz não suficiente. Primeiro que teria que diferenciar onde é feita a ligação nos compontes, tipo, qual das extremidades de um resistor. E ainda teria componentes diferentes, como transistores que possuem mais que duas ligações. Até mesmo o conceito de noh isolado não seria o que eu coloquei, tipo, um resistor que tivesse somente uma das extremidades conectadas nao serviria para nada em um sistema elétrico…

L

Ah sim, tranqüilo =). No caso do meu sistema elétrico, é um de grande porte. Realmente existe a possibilidade de elementos de 3 conexões; seriam os Trasformadores de 3 enrolamentos. Quanto ao conceito de nó isolado, na teoria de grandes sistemas ele é válido. Um componente pode possuir uma única ligação, porque a gente fecha o outro lado através de um curto circuito com a terra (que eu chamo de nó zero). Esse programa vai servir pra calcular curtos-circuitos (na verdade, já calcula, mas não remove os elementos). Bom, é isso ai, em alguns dias estou de volta =)

renzonuccitelli

Entendi, mas acredito que em termos de circuito, quanto vc retira todo os elementos de uma extremidade, isso não quer necessariamente dizer que vc a ligará ao terra. Mas enfim, isso depende do seu modelo. Boa sorte aí.

Criado 6 de janeiro de 2009
Ultima resposta 7 de jan. de 2009
Respostas 13
Participantes 3