Começando Orientação a Objeto - Ajuda e Duvidas [Texto médio com exemplos]

Oi pessoal, estou com um exercicio aqui e preciso de ajuda mesmo. Semana passada faltei uma aula importante e meu professor mandou me virar, nem ajudou. Fora que minha universidade só me entregou o material dessa materia ontem e eu tenho um exercicio para entregar hoje. Então venho aqui pedir muito a ajuda de vocês. Não consigo contatar meus colegas de turma para ajudar, porque mais uma “excelencia” do professor é que ele estimula os alunos a não se ajudarem (não reparem, to meio chateado com ele, até pq estou numa universidade paga e ele deveria me ensinar. Não faltei por vagabundagem :frowning: ).

Aqui vai o exercicio, esta bem auto explicativo.
Main.java

package Exercicios;

import javax.swing.*;


public class Main {


	public static void main (String args[]) {

		Lista lista = new Lista();
		int dado = -1;
		while ( dado != 0 ) {
	
			dado = Integer.parseInt(JOptionPane.showInputDialog(
			" 1 - incluir novo elemento no inicio da lista\n" +
			" 2 - incluir novo elemento no final da lista\n" +
			" 3 - contar o numero de elementos da lista\n" +
			" 4 - incluir novo elemento em local especifico da lista\n" +
			" 5 - remover elemento no inicio da lista\n" +
			" 6 - remover elemento no final da lista\n" +
			" 7 - remover elemento em posição especifica na lista\n" +
			" 8 - listar todos os dados de todos os elementos da lista\n" +
			" 9 - encontrar pessoa na lista\n" +
			" 11 - listar teste"));

			switch (dado) {
				case 1:
					lista.inserirInicio(lista.leitura("Valor a ser inserido no inicio"));
					//System.out.println(lista.listar());
					lista.saidaTeste();
					break;
				case 2:
					lista.inserirFim(lista.leitura("Valor a ser inserido no fim"));
					lista.saidaTeste();
					break;
				case 3:
					break;
				case 11:
					lista.listar();
					break;
					
					
			}
		}
	}

No.java

package Exercicios;

public class No {

	private int valor;
	private No proximo;

	public No() {
		setValor(0);
		setProximo(null);
	}
	public No(int pNovo, No pProximo) {
		setValor(pNovo);
		setProximo(pProximo);
	}
	public void setValor(int pNovo) {
		valor = pNovo;
	}
	public void setProximo(No pNovo) {
		proximo = pNovo;
	}
	public int getValor() {
		return valor;
	}
	public No getProximo() {
		return proximo;
	}
	
}

Lista.java

package Exercicios;

import javax.swing.*;

public class Lista {

	private No inicio;

	public Lista() {

		setInicio(null);

	}

	public Lista(No pInicio) {

		inicio = pInicio;
	}

	public String listar() {

		if (getInicio() != null) {

			String saida = "";
			No proximo = getInicio();
			while (proximo != null) {
				saida = saida + ", " + proximo.getValor();
				proximo = proximo.getProximo();
			}
			return saida.substring(1);
		} else {
			return "Lista vazia";
		}
	}

	public No getInicio() {
		return inicio;
	}

	public void setInicio(No pNovo) {
		inicio = pNovo;
	}

	public int leitura(String args) {
		return Integer.parseInt(JOptionPane.showInputDialog(args));
	}

	public void inserirFim(int pNovo) {
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		setInicio(novo);
	}

	public void removerFim() {
		No atual, temp;
		if (getInicio() != null) {

			atual = getInicio();
			if (atual.getProximo() != null) {
				while (atual.getProximo().getProximo() != null) {
					atual = atual.getProximo();
				}
				temp = atual.getProximo();
				atual.setProximo(null);
			} else {
				temp = getInicio();
				setInicio(null);
			}
			temp = null;
		} else {
			JOptionPane.showMessageDialog(null, "Lista vazia");
		}
	}

	public void inserirInicio(int pNovo) {
		//No temp;
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		novo.setProximo(novo);
		novo.setValor(0);
		setInicio(novo);
	}

	public void removerInicio() {
		No atual;
		if (getInicio() != null) {
			atual = getInicio();
			if (atual.getProximo() != null) {
				setInicio(atual.getProximo());
			}
			atual = null;
		}
	}

	public void saidaTeste() {

		System.out.println("Valor No atual: " + inicio.getValor() + " | "
				+ "ID Proximo = " + inicio.getProximo() + " | ID Atual ="
				+ this.inicio);
	}
}

Desculpa a ignorância é que estou começando mesmo em programação. Minha duvida, isso é um exemplo de lista encadeada, certo?

A classe No e Lista foi a que perdi na aula passada, consegui com um colega. Eu estou com problemas nessa rotina abaixo, acho que esta me faltando entender o que deve ser feito:

Lista.java

...
public void inserirInicio(int pNovo) {
		//No temp;
		No novo = new No();
		novo.setValor(pNovo);
		novo.setProximo(getInicio());
		novo.setProximo(novo);
		novo.setValor(0);
		setInicio(novo);
	}
...

O que eu to pensando é o seguinte, eu adiciono um valor ao “No novo”(novo.setValor(pNovo))e depois eu tenho que passar esse valor para o “No proximo” (novo.setProximo(novo)) e apagar o valor do “No novo”(novo.setValor(0)), preferiria deixar em null, mas parece que não dá.

O problema que estou tendo nesse caso é que na segunda vez que adiciono no inicio da lista, o ID do “No proximo” esta com o mesmo ID do “No atual”, quando o “No proximo” deveria ter o ID da inserção anterior.

Através dessa rotina:

Listar.java

...
public void saidaTeste() {

		System.out.println("Valor No atual: " + inicio.getValor() + " | "
				+ "ID Proximo = " + inicio.getProximo() + " | ID Atual ="
				+ this.inicio);
	}
...

Se alguem puder me ajudar eu agradeço.
vlw

Bom,

Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue

[quote=Blackbeard]
Lista.java

... public void inserirInicio(int pNovo) { //No temp; No novo = new No(); novo.setValor(pNovo); novo.setProximo(getInicio()); novo.setProximo(novo); novo.setValor(0); setInicio(novo); } ... [/quote]
novo.setValor e setProximo duas vezes? Se a instância a que o novo se refere não mudar, novo sempre estará apontando para ele mesmo.

[quote=ralphsilver]Bom,

Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue
[/quote]
++

Eu tb não quero resolvido, o que deixei de perguntar mas era o que estava querendo saber é o seguinte:

na rotina de inserir no inicio da lista, eu devo inserir o valor em No proximo e deixar o valor do No atual vazio? eu quero entender a teoria em cima disto e não que vcs resolvam pra mim.

Alias, até ja achei esse exercicio resolvido aqui no guj. Mas o que quero mesmo é uma ajuda teorica.

vlw

Po… vcs ai em cima não são de nada mesmo em… acordaram com a biba achando que to pedindo pra resolver exercicio e ainda prejudica o topico!

Se eu tivesse dito: “alguem pode resolver para mim” ou “me passa o codigo ae…” ai tu diz q to pedindo pra resolver.

Só perguntei teoria, conceito, não mais. vlw por nada.

flw

[quote=ralphsilver]Aqui no fórum não fazemos lição, agente tira dúvidas ou corrige erros justamente para elas aprenderem quando estão começando…
Mas aqui vai a dica… há item redundante aí justamente nesse método… dá uma forçada que vc consegue
[/quote]

Por que essa recriminação?

Ele fez o correto:

  • Publicou o que já fez;
  • Explicou onde tem dúvida;
  • Mostrou o que tentou fazer.

E pediu ajuda, não para fazer a lição para ele.

Blackbeard, a dica que te dou quando trabalhar com listas é desenhar os dois nós.

  1. Desenhe uma caixinha para cada nó.
  2. Coloque no “canto” da caixinha um quadrino menor, que indica o ponteiro para o próximo nó (ou dois quadrinhos, se for duplamente encadeada);
  3. Faça o desenho da situação antes e depois.
  4. Escreva os nomes de cada nó, mantendo a coerência em cada desenho.

Para a operação de inserir no início, vc teria o desenho em anexo.

Através dele, fica bem fácil ver o que deveria ser feito:

public  void inserirInicio(int pNovo) {  
   No novo = new No();
   novo.serValor(pNovo);
   novo.setProximo(inicio); //Veja que na nova situação, o próximo do novo nó é o atual inicio.
   setInicio(novo); //Como dá para ver no desenho, o novo início da lista é o novo nó.
}

Como mais nada mudou, é só isso que tem que fazer no método!!! Esses desenhos são muito úteis, eu frequentemente os desenho quando estou fazendo esse tipo de classe.

Oi ViniGodoy

 Meu, muito obrigado mesmo pela ajuda. Só agora que fui olhar. Entendi bem a lógica agora, tava bem perdido não entendendo direito como apontar os nós.

Denovo, obrigado mesmo. :smiley:

Eae…
deu certo?
Se não tiver conseguindo ainda, adiciona ae no msn que eu te ajudo (mandei ele por mensagem privada)

E quanto os outros, axo que não teve nada de errado no que ele fez… Ele não tem a matéria e está com dúvida, postou o que já fez comentado, e pediu ajuda para continuar…