[código pequeno] porque só lista o ultimo carro da lista?

import javax.swing.JOptionPane;


public class Principal {
	static Lista lista = new Lista();
	public static void main(String[] args) {
		int i=0;
		
		do{
			Carro carro = new Carro("",0);
			String nome = JOptionPane.showInputDialog("Digite o nome do carro :");
			carro.setNome(nome);
			int ano = Integer.parseInt(JOptionPane.showInputDialog("Digite o ano do carro :"));
			carro.setAno(ano);
			
			lista.salva(carro);
			
			String opcao = JOptionPane.showInputDialog("Deseja encerrar? 'S'");
			if(opcao.equalsIgnoreCase("s")) i++;
		}while(i<1);

		lista.listar();
	}

}
import java.util.Vector;


public class Lista {
	private Vector<Carro> lista;
	
	public void salva(Carro carro){
		lista = new Vector<Carro>();
		lista.addElement(carro);
		System.out.println(carro);
	}
	
	public void listar(){
		for(int i =0; i<lista.size();i++){
			System.out.println(lista.elementAt(i));
		}
	}
}

public class Carro {
	
	private String nome;
	private int ano;
	
	public Carro(String n, int a) {
		nome=n;
		ano=a;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getAno() {
		return ano;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}
	public String toString(){
		return "Nome: "+nome+"\nAno :"+ano;
	}

}

eu insiro uns tres carros na lista… porém quando chega no métido listar() da classe principal… só lista o ultimo :cry: pq???

Cada vez que vc salva um carro vc cria uma nova lista.

Tira o new da lista do método salvar que deve funcionar.

muda isso

private Vector<Carro> lista; 

public void salva(Carro carro){   
        lista = new Vector<Carro>();   
        lista.addElement(carro);   
        System.out.println(carro);   
    }   

para isso


private Vector<Carro> lista = new Vector<Carro>();

public void salva(Carro carro){   
        lista.addElement(carro);   
        System.out.println(carro);   
    }   

[quote=plic_ploc]muda isso

private Vector<Carro> lista; 

public void salva(Carro carro){   
        lista = new Vector<Carro>();   
        lista.addElement(carro);   
        System.out.println(carro);   
    }   

para isso

[code]

private Vector lista = new Vector();

public void salva(Carro carro){
lista.addElement(carro);
System.out.println(carro);
}

[/code][/quote]
valeu funfo :wink:

Ok… agora que você terminou o seu código, que tal refatora-lo para não usar mais a classe Vector?
A classe Vector é considera obsoleta desde a versão 1.2 do Java. Recomenda-se que use no lugar uma das classes de List. A List é mais rápida (não tem sincronização), tem uma interface padrão (o que permite trocar entre vários algoritmos) e ainda é recomendada pela Sun.

Para ver um exemplo completo de como se usa listas, clique aqui:
http://www.guj.com.br/posts/list/74068.java

Teu código vai ficar muito melhor! :wink:

Uma OUTRA classe de List, vc quis dizer? Mal ou mal, Vector é um List, também.

Sim, foi isso que eu quis dizer. O substituto direto do Vector é o ArrayList. O do Hashtable (que também é obsoleta) é o HashMap.

O exemplo no link mostra o ArrayList e LinkedList.

O Vector originalmente não era uma classe de List, pois ele é até mesmo anterior a interface.

A interface dele apenas foi adaptada, para que se tornasse compatível e facilitar a interoperabilidade do sistema legado com o novo. Até por isso, o Vector tem métodos com funções duplicadas (addElement e add, por exemplo).

Nem mesmo quando sincronização é exigida ainda se recomenda usar Vector. Hoje a recomendação é usar um wrapper de sincronização, apenas nos métodos onde ela for necessária:

List<String> listaSincronizada = Collections.synchronizedList(umaLista);

Ainda assim, o uso de qualquer classe lista diretamente não é recomendado. O mesmo vale para os mapas.
O ideal é usar as classes através da interface:

List<String> umaLista = new ArrayList<String>();
Map<String, Integer> umMapa = new HashMap<String, Integer>();

Isso permite que a implementação da lista seja trocada no futuro, sem que seja necessário alterar o código.