ArrayList

7 respostas
F

Salve Turma,

Eu tinha um problema pra resolver e acabei utilizando arraylist pra armazenar alguns objetos, incluido outras coleções.
Só que a certa altura percebi que o tratamento estava tomando proporções perigosas.
Fiz bem em utilizar arraylist pra armazenar meus objetos? ou deveria ter usado outro tipo de estrutura?
Antes de mais nada queria dizer que serviu perfeitamente pra o que eu queira, mas estou preocpado com a perfromance.

Francisco Júnior

7 Respostas

maresp

Não sei a quantidade e o porte dos objetos que vc está mantendo no seu ArrayList. Na verdade vc tem quem considerar a maneira como vc está iterando sobre seu ArrayList para sacar os objetos da lista. Vc está utilizando Iterator? De mais detalhes ou coloque seu código…

F

Faço laços e caminho nas coleções, mas sem usar Iterator.
Na realidade eu recebo uma coleção de objetos de um tipo e tenho que separar em subcoleções de acordo com a o atributo Unidade de cada objeto. Se existem 10 objetos na coleção que recebo, 4 com valor do atributo “Unidade X” e 6 com valor do atributo “Unidade Y”, tenho que devolver uma coleção com duas subcoleções de acordo com os valores do atributo.

Será que consegui ser claro?
:?

Rafael_Steil

Detalhe sobre performance: fazer loop de 0 ate total e utilizar get(i) eh bastante lento, pois toda vez a classe ira fazer um loop do inicio ate o registro que vc quer… Utilizando iterator, ela manter um registro do ultimo elemnto acessado.

Em relacao ao teu problema, talvez seja bem mais interessante ter a sua propria classe para guardar os valores, ao inves de enputir de collections dentro de collections dentro de collections…

Crie as classes para guardaer as coisas da maneira que vc precisa… tipo, vc tem uma classe Aluno, uma SalaDeAula que contem uma colecao de Aluno, e entao vc disponibiliza algum metodo getAluno(), por exemplo…

Eh bem melhor do que ter um HashMap com ArrayList como valor, por exemplo…

Rafael

F

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.

maresp

Suas operações com a collection sempre envolve todos objetos da lista? Se sim utilize alguma implementação de List. Agora se vc precisa pegar um unico objeto da tua collection então utilize algo como Hashtable ou HashMap. Vale a pena dar uma lida na documentação, mais especificamente no pacote java.util (collections framework).
Quanto a utilizar collections dentro de collections é bom sempre reavaliar se isso é realmente necessário ou existe uma outra forma de implementação.

Rafael_Steil

“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

F

Rafael, realmente…

PQP, valeu mesmo. Fiz vc escrever um bocado, mas vc matou bem a idéia.

Maresp valeu a dica tb.

Show de bola. :slight_smile:

Criado 20 de fevereiro de 2004
Ultima resposta 20 de fev. de 2004
Respostas 7
Participantes 3