Java - Dúvida: Coleções - Saída

8 respostas
V

Olá! Estou aqui novamente, galera!
Já estou sentindo que estou abusando alguém vindo cheio de perguntas. Kkkkkk

Enfim...

Exemplo: Classe Materia -> Para registro de matérias com objetivo de guardar algumas informações, por exemplo o número de aulas que essa materia tem que ter em cada Sala (acho que deu pra entender).
public class Materia {
	static ArrayList<Materia> materias = new ArrayList<Materia>();
	private String nome;
	//Número de Aulas da materia
	private int aulasInfatil;
	private int aulasFundamental;
	private int aulasMedio;
	
	public Materia(String nome, int aulasInfantil, int aulasFundamental, int aulasMedio){
		this.nome = nome;
		this.aulasInfatil = aulasInfantil;
		this.aulasFundamental = aulasFundamental;
		this.aulasMedio = aulasMedio;
		
		materias.add(this);
	}
	//Getters e Setters
}
Main básico com registro de algumas matérias.
public class Main {
	public static void main(String[] args) {
		Materia matematica = new Materia("Matemática", 0, 5, 6);
		Materia portugues = new Materia("L. Portuguesa", 0, 3, 4);
		
		System.out.println(Materia.materias);
	}
}

O "System.out.println(Materia.materias);" tem saída:
"[com.br.cadastroDeFuncionario.Materia@23f9e6e5, com.br.cadastroDeFuncionario.Materia@6ba5d6d6]"

Então a dúvida é a seguinte:
Como fazer que a saída seja de outra forma?
Poder escolher a saída pelos nomes, ou número de aulas...

8 Respostas

Lukas0145

Olá,

Todo ArrayList possuí um índice o qual você deve informar para que ele possa lhe retornar o que está dentro daquele índice. No seu caso, você mandou ele imprimir na tela o ArrayList em si, isso lhe imprimirá, na verdade, o endereço de memória do ArrayList.

Portanto, sempre que usar um ArrayList, informe a posição/índice/index: array.get(índice)

System.out.println(Materia.materias.get(1));
V

Já havia testado isso e deu o mesmo problema.

Saída:
“com.br.cadastroDeFuncionario.Materia@f715510”

R

vc tem que implementar o método toString que é herdado da classe Object na sua classe Materia,para que cada objeto seja exibido no padrão que vc deseja:

@Override
public String toString(){
   return "[aulasInfatil="+aulasInfatil+" ,aulasFundamental ="+aulasFundamental+","+"aulasMedio="+aulasMedio ;  
}

E na sua classe Main,dentro método main adiciona isso:

for(Materia materia in Materia.materias){
 System.out.println(materia);
}

o for each serve para iterar em cada objeto existente dentro da sua coleção.

S

Na verdade esse foreach está parecendo ser uma mistura de Java e C#, o de java não possui palavra reservada “in”, mas sim dessa forma:

for(Materia materia : Materia.materias){
 System.out.println(materia);
}
R

vacilo meu ,me lembrei do foreach do python e acabei misturando com o do java.

V

Valeu! Consegui e fiz uns testes aqui.
Eu já tinha reparado o "in" e consertei-o imediatamente.

Fiz algumas alterações no código e deixei-o maior para testar.

Materia.java
public class Materia {
	static ArrayList<Materia> materias = new ArrayList<Materia>(); // Todas
	static ArrayList<Materia> materiasInfantil = new ArrayList<Materia>();
	static ArrayList<Materia> materiasFundamental = new ArrayList<Materia>();
	static ArrayList<Materia> materiasMedio = new ArrayList<Materia>();
	private String nome;
	//Número de Aulas da materia
	private int aulasInfatil;
	private int aulasFundamental;
	private int aulasMedio;
	
	public Materia(String nome, int aulasInfantil, int aulasFundamental, int aulasMedio){
		this.nome = nome;
		this.aulasInfatil = aulasInfantil;
		this.aulasFundamental = aulasFundamental;
		this.aulasMedio = aulasMedio;
		
		materias.add(this);
	}
	public static void checkMateria(){
		for(Materia materia : Materia.materias){
			//Infantil
			if(materia.toString(0) != 0){
				Materia.materiasInfantil.add(materia);
			}
			//Fundamental
			if(materia.toString(1) != 0){
				Materia.materiasFundamental.add(materia);
			}
			//Medio
			if(materia.toString(2) != 0){
				Materia.materiasMedio.add(materia);
			}
		}
	}
	@Override  
	public String toString(){  
	   return nome;
	}
	
	public int toString(int type){ 
		if(type == 0){
			return aulasInfatil;
		}
		else if(type == 1){
			return aulasFundamental;
		}
		else if(type == 2){
			return aulasMedio;
		}
		else{
			return 0;
		}
	}
	
	//Getters e Setters
}
Main.java
public class Main {
	public static void main(String[] args) {
		
		Materia biologia = new Materia("Biologia", 0, 0, 3);
		Materia ciencia = new Materia("Ciência", 0, 5, 0);
		Materia espanhol = new Materia("Espanhol", 0, 0, 1);
		Materia filosofia = new Materia("Filosofia", 0, 0, 1);
		Materia matematica = new Materia("Matemática", 0, 5, 6);
		Materia portugues = new Materia("L. Portuguesa", 0, 3, 4);
		
		Materia.checkMateria();
		
		System.out.println("Matérias Totais: " + Materia.materias);
		System.out.println("Matérias do Infantil: " + Materia.materiasInfantil);
		System.out.println("Matérias do Fundamental: " + Materia.materiasFundamental);
		System.out.println("Matérias do Médio: " + Materia.materiasMedio);
	}
}
Saída
Matérias Totais: [Biologia, Ciência, Espanhol, Filosofia, Matemática, L. Portuguesa]
Matérias do Infantil: []
Matérias do Fundamental: [Ciência, Matemática, L. Portuguesa]
Matérias do Médio: [Biologia, Espanhol, Filosofia, Matemática, L. Portuguesa]

Valeu mesmo, quem olhou o código se souber como melhora-lo é só falar!
:D

S

VA:

Valeu mesmo, quem olhou o código se souber como melhora-lo é só falar!
:D

Uma forma de melhorar é ajustando esse trecho:

public int toString(int type){   
        if(type == 0){  
            return aulasInfatil;  
        }  
        else if(type == 1){  
            return aulasFundamental;  
        }  
        else if(type == 2){  
            return aulasMedio;  
        }  
        else{  
            return 0;  
        }  
    }

Para esse:

public int toString(int type){   
        switch (type) {
           case AULA_INFANTIL:  // observe que cada case não possui break
              return aulaInfantil;
           case AULA_FUNDAMENTAL:
              return aulaFundamental;
           case AULA_MEDIO:
              return aulaMedio;
           default:
              return AULA_INDEFINIDA;
        }  
    }

E lá no topo você inclui as constantes usadas no switch:

public class Materia { 
   public static final int AULA_INFANTIL = 0;
   public static final int AULA_FUNDAMENTAL = 1;
   public static final int AULA_MEDIO = 2;
   public static final int AULA_INDEFINIDA = -1; // aqui pode ser um coringa
   ...

Dessa forma facilita a manutenção e ainda trata erros como um tipo indefinido.
Outra coisa, em exemplos que você usar a estrutura switch-case, sempre há um break para cada case, mas nesse exemplo não é preciso pois o return equivale a um break com a possibilidade de retornar o valor a quem chamou o método.

Pra melhorar mesmo seria bom você separar os tipos de constantes para Enum’s, mas aí fica pra um nível mais alto no aprendizado da linguagem.

Espero ter ajudado.

V

Ajudou muito! Valeu! Já fiz as edições aqui vai ajudar futuramente se o programa crescer :smiley:

Valeu!

Criado 3 de julho de 2013
Ultima resposta 4 de jul. de 2013
Respostas 8
Participantes 4