"Dúvida" Apostila CS14 {Caelum}

1 resposta
E

Olá pessoal.

Nas duas últimas semanas tirei um tempo para "rever" algumas coisas básicas de java, já que tenho me dedicado um pouco mais em Ruby e Rails.
Estou estudando a apostila da Caelum CS 14, ótima por sinal.
Minha dúvida é digamos bem burrinha mesmo (Não tenho vergonha de dizer isso :---) ).

Quando vou imprimir a lista de alunos, não printa os nomes e sim o endereço/referência do objeto, conforme abaixo:

Espaço atual utilizado: 1 - Tamanho total disponível: 100
Metódo testaAdicionaNoFim - br.com.caelum.ed.Vetor@1172e08

Fontes: Classe de testes
/*
	 * Teste ADICIONA NO FIM
	 */
	private void testaAdicionaNoFim(){
		Aluno a1 = new Aluno();
		Aluno a2 = new Aluno();
		a1.setNome("Rafael");
		a2.setNome("Paulo");
		Vetor lista = new Vetor();
		lista.adiciona(a1);
		lista.adiciona(a2);
		System.out.println("Metódo testaAdicionaNoFim - " + lista);
Classe Vetor
package br.com.caelum.ed;

public class Vetor {
	
	private int totalDeAlunos = 0;
	private Aluno[] alunos = new Aluno[100]; 
	
	/*
	 * Metódo adiciona. 
	 * Aqui o consumo de tempo é CONSTANTE (Melhor desempenho - o tempo de processamento será sempre o mesmo)
	 */
	public void adiciona(Aluno aluno){
		//Verifica primeiro se o array atual tem espaço disponível
		this.garantaEspaco();
		this.alunos[this.totalDeAlunos] = aluno;
		this.totalDeAlunos++;
	}
	
	/*
	 * Adiciona um aluno no array, verificando se a posição é válida, se a posição já existir
	 * é preciso mover todos os elementos para a direita e sim inserir o dado na posição liberada
	 */
	public void adiciona(int posicao, Aluno aluno){	
		//Verifica primeiro se o array atual tem espaço disponível
		this.garantaEspaco();
		if(!this.posicaoValida(posicao)){
			throw new IllegalArgumentException("Posição Inválida!");
		}
		for(int i=this.totalDeAlunos-1; i >= posicao; i--){     
			this.alunos[i + 1] = this.alunos[i];
		}
		this.alunos[posicao] = aluno;
		this.totalDeAlunos++;
	}
	
	/*
	 * Retorna o aluno no array da posição especificada
	 */
	public Aluno pega(int posicao){
		if(!this.posicaoOcupada(posicao)){
			throw new IllegalArgumentException("Posição Inválida!");
		}
		return this.alunos[posicao];
	}
	
	/*
	 * Remove o aluno no array da posição espeficada e reorganiza o array 
	 * movendo os elementos para a esquerda, reordenando o array novamente
	 */
	public void remove(int posicao){
		if(!(this.posicaoOcupada(posicao))){
			throw new IllegalArgumentException("Posição Inválida!");
		}
		for(int i=posicao; i < this.totalDeAlunos -1; i++){
			this.alunos[i] = this.alunos[i + 1];
		}
		this.totalDeAlunos--;
	}
	/*
	 * Valida se a posição esta ocupada
	 * Realiza a validação com o seguinte crieterio:
	 * Se a posição estiver entre 0 e a PENULTIMA posição preenchida no array, retorna true, senão retorna false
	 */
	private boolean posicaoOcupada(int posicao){
		return posicao >=0 && posicao < this.totalDeAlunos;
	}
	
	/*
	 * Valida se a posição é válida
	 * Realiza a validação com o seguinte criterio: 
	 * Se posicao estiver entre 0 e a ÚLTIMA posição preenchida no array, retorna true, senão retorna false
	 */
	private boolean posicaoValida(int posicao){
		return posicao >=0 && posicao <= this.totalDeAlunos;
	}
	
	/*
	 * Metódo contem, aqui a comparação é via equals, ou seja,
	 * comparando referência de objetos, que é o correto aqui nesse caso
	 */
	public boolean contem(Aluno aluno){
		for(int i=0; i < this.totalDeAlunos; i++){
			if(aluno.equals(this.alunos[i])){
				return true;
			}
		}
		return false;
	}
	
	/*
	 * Return of lenght the list
	 */
	public int tamanho(){
		return this.totalDeAlunos;
	}
	
	/*
	 * Sobrescrevendo o metódo toString()
	 * (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString(){
		if(this.totalDeAlunos == 0){
			return "[]";
		}
		StringBuilder builder = new StringBuilder();
		builder.append("[");
		for(int i=0; i < this.totalDeAlunos -1; i++){
			builder.append(this.alunos[i]);
			builder.append(", ");
		}
		builder.append(this.alunos[this.totalDeAlunos -1]);
		builder.append("]");
		return super.toString();
	} 
	
	/*
	 * Verifica se o espaço do Array inicial estorou, 
	 * se sim, cria uma nova array com tamanho duas vezes maior, 
	 * realiza a cópia dos dados e depois realoca novamente no original com o tamanho alterado (t.o * 2)
	 * {ALOCAÇÃO DINÂMICA}
	 */
	private void garantaEspaco(){
		if(this.totalDeAlunos == this.alunos.length){
			Aluno[] novaArray = new Aluno[this.alunos.length * 2];
			for(int i=0; i < alunos.length; i++){
				novaArray[i] = this.alunos[i];
			}
			this.alunos = novaArray;
		}else{
			System.out.println("Espaço atual utilizado: " + this.totalDeAlunos + " - Tamanho total disponível: " + this.alunos.length);
		}
	}
}
Classe Aluno
package br.com.caelum.ed;

public class Aluno {
	
	private String nome;

	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}	
	public String toString(){
		return this.nome;	
	}
	public boolean equals(Object object){
		Aluno outro = (Aluno) object;
		return this.nome.equals(outro.nome);
	}
}

Agradeço a "força".

Abs e obrigado!!!

1 Resposta

thundercas

edvaldomelo,

O problema está neste trecho:

private void testaAdicionaNoFim(){  
Aluno a1 = new Aluno();  
Aluno a2 = new Aluno();  
a1.setNome("Rafael");  
a2.setNome("Paulo");  
Vetor lista = new Vetor();  
lista.adiciona(a1);  
lista.adiciona(a2);  
System.out.println("Metódo testaAdicionaNoFim - " + lista);

Você não pode imprimir apenas “lista”. Você tem que imprimir os atributos de lista. Como no trecho abaixo:

System.out.println("Metódo testaAdicionaNoFim - " + lista.pega(1));
System.out.println("Metódo testaAdicionaNoFim - " + lista.pega(2));

Se você imprimir diretamente lista, estará imprimir o método toString(), herdado de Object. Só para você entender melhor, se vc sobrescrevesse o método toString, conforme abaixo, o seu código imprimiria “Olá Mundo”:

public String toString() {
     return "Olá Mundo";
}

Espero ter ajudado, abraços

Criado 6 de novembro de 2009
Ultima resposta 6 de nov. de 2009
Respostas 1
Participantes 2