Jump to content

Ajuda com sintax de listas!


Hellblazzer
 Share

Recommended Posts

Boas pessoal.

Estou a começar a trabalhar com listas ligadas em Programação orientada a objectos na faculdade.

Estou à toa com a sintax das listas. Percebi o conceito e como funciona mas nos slides que os profs dão há exemplos assim.

public class A {
  private Lista salas;
  public A() {
    for (int i = 0; i != 10; ++i){
      Sala s = new Sala(“C60” + i);
      salas.add(s);
    }
  }
  public void mostraSalas(){
    while (salas.hasNext()) {
       System.out.println((Sala)salas.next());
    }
  }
}

Eu estou a tentar perceber isto e a fazer um exemplo só para me entender, usando tipo uma lista de Carros:

package Listas;

import java.util.List;

public class carros {

private String marca;
private String modelo;

public String getMarca() {
	return marca;
}

public String getModelo() {
	return modelo;
}

public carros(String marca, String modelo) {
	this.marca = marca;
	this.modelo = modelo;
}

public void mostra() {
	System.out.println(toString());
}

public List carros;

public void insereCarros() {
    for (int i = 0; i != 10; ++i){
      carros c = new carros("Ford" , "Fiesta");
      carros.add(c);  //Aqui não consigo usar o add.
    }
  }

  public void mostraCarros(){
    while (carros.hasNext()) {
       System.out.println((carros)carros.next());  //Não consigo usar o next
    }
  }
}

Falta-me algum import? Também já li no slide que podem ser precisos iteradores... mas para ser sincero não percebi o que são nem o que fazem.

Alguém me pode ajudar a perceber como usar as listas? É que tenho um trabalho para fazer, e não tenho horário de dúvidas até lá...

Se me derem código para criar a lista do tipo de dados carro, inserir novos carros na lista, apagar o 1º ou o escolhido e mostrar... Sei que pode parecer pedir muito mas eu ficava mesmo muito agradecido e sei que há gente aqui para quem isto é básico...

Obrigado e cumprimentos

Link to comment
Share on other sites

As listas, ou outras estruturas de dados em Java, podem ser percorridas com ciclos for, usando os índices, com iteradores, que é a forma mais comum até ao Java 5, ou com o ciclo foreach, que foi introduzido no Java 5 e que pode ser mais compacto e simples de usar, internamente, o ciclo recorre a iteradores.

Tirando o acesso por índices, que é simples de perceber e que raramente é usado, a forma mais comum são os iteradores. Iteradores não são mais que mecanismos de acesso aos dados da lista sem te darem acesso à estrutura interna da lista, são mecanismos genéricos, que todas as estruturas têm, não é apenas das listas, e que permitem percorrer a estrutura e aceder aos seus elementos. Permitem acções como remoção de elemento corrente mas cujo seu uso desaconselho vivamente.

Ora um iterador é um objecto da classe Iterator, para usares um iterador de uma estrutura basta usares o método dessa estrutura que te fornece o iterador. Depois, o iterador tem um método que te diz se existem elementos e outro que te permite obter um elemento e passar para a posição seguinte da lista, onde pode ou não existir outro elemento.

Um exemplo simples do uso de iteradores:

LinkedList listaLigada = new LinkedList();

listaLigada.add("Elemento 1");
listaLigada.add("Elemento 2");
listaLigada.add("Elemento 3");
listaLigada.add("Elemento 4");
listaLigada.add("Elemento 5");

Iterator it = listaLigada.listIterator();// obter o iterador desta lista

while(it.hasNext()) {
   System.out.println(it.next()); //avançar para o próximo elemento e imprimir o seu valor.
}

Um iterador inicia sempre na posição antes do primeiro elemento da lista, quase como se iniciasse em -1, e só avança quando invocares o método next(), nessa altura o iterador avança para o elemento a seguir e devolve-o.

Não há muito mais a dizer sobre iteradores, o que código que coloquei é o exemplo típico e que deve ser o mais usado em toda a programação com listas em Java.

Quanto a listas, estou a usar um tipo de lista standard do Java, a LinkedList, que implementa uma lista ligada simples, pelo que vi no teu tópico, parece-me que estás a usar listas entregues pelos teus professores, podem existir algumas diferenças pontuais nos métodos e formas de funcionamento.

Ainda em relação a listas, tem atenção que não podes modificar uma lista enquanto a percorres, podes modificar os elementos mas não podes adicionar novos ou remover existentes, a estrutura da lista não pode mudar enquanto a mesma é percorrida. É uma restrição da plataforma e terás excepções se o tentares fazer.

Bem, isto foi uma resposta escrita um pouco de "rajada" e pode não ser muito explicito, se precisares de mais explicações é só perguntar.

Link to comment
Share on other sites

Só para adicionar ao bom post do Knitter. No teu caso não funciona porque a tua lista não está instanciada. No exemplo do teu prof, é omitida essa parte e portanto também não deverá funcionar.

Basicamente posto, se não crias a lista (algo tipo "carros = new Lista();") não tens a dita lista, ela não existe. Obviamente se a lista não existe, não podes adicionar elementos ou percorrer os mesmos.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Boas,

Muito obrigado pela disponibilidade. Não foi de rajada, achei bastante esclarecedor até.

LinkedList listaLigada = new LinkedList();

listaLigada.add("Elemento 1");
listaLigada.add("Elemento 2");
//....

Iterator it = listaLigada.listIterator();// obter o iterador desta lista

while(it.hasNext()) {
   System.out.println(it.next()); //avançar para o próximo elemento e imprimir o seu valor.
}

"Aproveitando" o código... Tendo a classe Carro() criada agora assim:

package Listas;

import java.util.List;

public class Carro {

private String marca;
private String modelo;

public String getMarca() {
	return marca;
}

public String getModelo() {
	return modelo;
}

public Carro(String marca, String modelo) {
	this.marca = marca;
	this.modelo = modelo;
}
}

Como posso fazer mesmo para criar uma lista de dados do tipo Carro?

É que ao olhar para esse código não percebo como associar a lista aos carros em si...  😛

Link to comment
Share on other sites

Pessoal já consegui tirar a dúvida.

Um prof sempre pôde dar-me 1 minutos. Aqui o objectivo não era usar já mesmo linked lists, mas sim usar uma lista normal e fazermos nós os Nós das listas "manualmente" para primeiro perceber como funciona um linked list.

Fiquei com:

Carro.java:

package Listas;


public class Carro {

private String marca;
private String modelo;

public String getMarca() {
	return marca;
}

public String getModelo() {
	return modelo;
}

public Carro(String marca, String modelo) {
	this.marca = marca;
	this.modelo = modelo;
}

public void mostra() {
	System.out.println(toString());

}
public String toString() {
	return marca + " " + modelo;
}

}

Stand.java (funciona como o main...):

package Listas;

import java.util.Scanner;

public class Stand {

public static void main(String[] args) {

	Scanner teclado = new Scanner(System.in);

	String marcatmp, modelotmp;

	ListaDeCarros lista = new ListaDeCarros();

	System.out
			.println("Introduza a Marca do veículo a inserir: ");
	marcatmp = teclado.next();

	System.out
	.println("Introduza o modelo do veículo a inserir: ");
	modelotmp = teclado.next();

	Carro carro = new Carro(marcatmp, modelotmp);
	lista.add(carro);

	carro = new Carro("Seat", "Ibiza");
	lista.add(carro);

	lista.mostraCarros();
} 

}

E o ListaDeCarros.java:

package Listas;

//import java.util.Iterator;
//import java.util.LinkedList;
import java.util.List;

public class ListaDeCarros {

private No primeiro = null;

private class No {

	private Carro item;
	private No seguinte;

	public No(final Carro item, final No seguinte) {
		this.item = item;
		this.seguinte = seguinte;
	}

	public Carro getItem() {
		return item;
	}

	public No getSeguinte() {
		return seguinte;
	}

}


public void add(Carro o) {
	if(primeiro == null){
		primeiro = new No(o, null);
		return;
	}
	No corrente = primeiro;
	while (corrente.seguinte != null) {
		corrente = corrente.seguinte;
	}
	corrente.seguinte = new No(o, null);
}


public void mostraCarros() {
	No corrente = primeiro;
	while (corrente != null) {
		System.out.println((Carro) corrente.getItem());
		corrente = corrente.seguinte;
	}
}

}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.