“FranciscoJunior”:
Rafael,
Blz, a questão do Iterator eu já entendi. Mas se eu criar uma classe que tem por atributo uma coleção, e no final jogar esse ojeto numa coleção eu não estaria só escondendo o problema?
Agradeço pela participação.
Francisco Júnior.
Voce nao joga em uma outra colecao o objeto de mais alto nivel… eh ele quem controla tudo…
Por exemplo, digamos que voce tenha um documento XML representando as turmas de alguma escola:
<?xml version="1.0" encoding="iso-8859-1"?>
<escola>
<!-- Turma 1 -->
<turma nome="Turma 1">
<alunos>
<aluno nome="Aluno 1.1"/>
<aluno nome="Aluno 1.2"/>
</alunos>
</turma>
<!-- Turma 2 -->
<turma nome="Turma 2">
<alunos>
<aluno nome="Aluno 2.1"/>
<aluno nome="Aluno 2.2"/>
<aluno nome="Aluno 2.3"/>
<aluno nome="Aluno 2.4"/>
</alunos>
</turma>
</escola>
Utilizando somente collections / maps, ficaria algo como
HashMap escolas = new HashMap();
// Cria uma escola
escolas.put("Escola 1", new ArrayList());
// Turma 1
HashMap turma1 = new HashMap();
turma1.put("nome", "Turma 1");
ArrayList alunos1 = new ArrayList();
alunos1.put("Aluno 1.1");
alunos1.put("Aluno 1.2");
turma1.put("alunos", alunos1);
// Turma 2
HashMap turma2 = new HashMap();
turma1.put("nome", "Turma 2");
ArrayList alunos2 = new ArrayList();
alunos2.put("Aluno 2.1");
alunos2.put("Aluno 2.2");
turma2.put("alunos", alunos2);
// Associa tudo a escola
((ArrayList)escolas.get("Escola 1")).add(turma1);
((ArrayList)escolas.get("Escola 1")).add(turma2);
Meio complicado e chato de manipular, nao?!.. Agora, se vc usar uma outra estrutura de dados, ficaria muito mais simples. Veja:
// Definicao das classes
class Aluno {
private String nome;
public Aluno(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
// override de hashCode e equals()
}
class Turma {
private String nome;
private ArrayList alunos = new ArrayList();
public void setNome(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public void addAluno(Aluno a) {
this.alunos.add(a);
}
public Aluno getAluno(Aluno a) {
int index = this.alunos.indexOf(a);
if (index > -1) {
return (Aluno)this.alunos.get(i);
}
return null;
}
public ArrayList getAlunos() {
return this.alunos;
}
// outros metodos de busca de alunos
// override de hashCode e equals()
}
class Escola {
private String nome;
private ArrayList turmas = new ArrayList();
public void setNome(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public void addTurma(Turma t) {
this.turmas.add(t);
}
public Turma getTurma(Turma t) {
int index = this.turmas.indexOf(t);
if (index > -1) {
return (Turma)this.turmas.get(i);
}
return null;
}
public Turma getByNome(String nome) {
for (Iterator iter = this.turmas.iterator(); iter.hasNext(); ) {
Turma t = (Turma)iter.next();
if (t.getNome().equals(nome)) {
return t;
}
}
return null;
}
// override de hashCode e equals()
}
class Escolas {
private HashMap escolasMap = new HashMap();
public void addEscola(Escola e) {
this.escolasMap.put(e.getNome, e);
}
public Escola getEscola(String nome) {
return (Escola)this.escolasMap.get(nome);
}
}
Com base nisso, voce popula os dados ad seguinte maneira:
Escolas escolas = new Escolas();
// Cria a escola 1
Escola escola1 = new Escola();
escola1.setNome("Escola 1");
// Turma 1
Turma turma1 = new Turma();
turma1.setNome("Turma 1");
turma1.addAluno(new Aluno("Aluno 1.1"));
turma1.addAluno(new Aluno("Aluno 1.2"));
// Turma 2
Turma turma2 = new Turma();
turma2.setNome("Turma 2");
turma2.addAluno(new Aluno("Aluno 2.1"));
turma2.addAluno(new Aluno("Aluno 2.2"));
// Adiciona as turmas
escola1.addTurma(turma1);
escola1.addTurma(turma2);
// Adiciona a escola
escolas.addEscola(escola1);
Para pegar determinado registro eh simples:
// Pega os alunos da turma 1 da escola 1
ArrayList alunos = escolas.getEscola("Escola 1").getTurma("Turma 1").getAlunos();
E assim por diante…
Fazendo dessa maneira, ou algo no estilo, o teu codigo fica facil de usar e manter.
Rafael