• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hellblazzer

Ajuda com sintax de listas!

5 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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...  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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;
	}
}

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora