Trabalhando com ArrayList
Trabalhando com ArrayList
Antes de chegarmos em toda a hierarquia das Collections vamos falar e utilizar um pouco o ArrayList
Adicionando elementos em uma lista
Para criar um objeto do tipo ArrayList, certamente fazemos como sempre: utilizando o operador new. Mas repare que acabamos passando um pouco mais de informações. Ao declarar a referência a uma ArrayList, passamos qual o tipo de objeto com o qual ela trabalhará. Se queremos uma lista de nomes de aulas, vamos declarar ArrayList<String>. Crie a classe TestandoListas, adicionando os nomes de algumas aulas que teremos nesse curso:
import java.util.ArrayList;
public class TestandoListas {
public static void main(String[] args) {
String aula1 = "Modelando a classe Aula";
String aula2 = "Conhecendo mais de listas";
String aula3 = "Trabalhando com Cursos e Sets";
ArrayList<String> aulas = new ArrayList<>();
aulas.add(aula1);
aulas.add(aula2);
aulas.add(aula3);
System.out.println(aulas);
}
}Qual é o resultado desse código? Ele mostra as aulas adicionadas em sequência! Por que isso acontece? Pois a classe ArrayList, ou uma de suas mães, reescreveu o método toString, para que internamente fizesse um for, concatenando os seus elementos internos separados por vírgula.
Removendo elementos
Bastante simples! O que mais podemos fazer com uma lista? As operações mais básicas que podemos imaginar, como por exemplo remover um determinado elemento. Usamos o método remove e depois mostramos o resultado para ver que a primeira foi removida:
aulas.remove(0);
System.out.println(aulas);Por que 0? Pois as listas, assim como a maioria dos casos no Java, são indexadas a partir do 0, e não do 1.
Percorrendo uma lista
Bem, talvez não seja a melhor das ideias fazer um System.out.println na nossa lista, pois talvez queiramos mostrar esses itens de alguma outra forma, como por exemplo um por linha. Como fazer isso? Utilizando o for de uma maneira especial, popularmente foreach. Lembrando que foreach não existe no Java como comando, e sim como um caso especial do for mesmo. Olhe o código:
for (int i = 0; i < aulas.size(); i++) {
String aula = aulas.get(i);
IO.println("Aula: " + aula);
}for (String aula : aulas) {
IO.println("Aula: " + aula);
}contains
O método contains é utilizado para verificar se um determinado elemento está presente na lista. Ele retorna true se o elemento estiver na lista e false caso contrário. O método utiliza o equals para comparar os elementos, então é importante que a classe dos objetos dentro da lista implemente corretamente o método equals. Veja o exemplo:
import java.util.ArrayList;
import java.util.Objects;
import java.util.List;
class Aluno {
private String nome;
public Aluno(String nome) {
this.nome = nome;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Aluno)) return false;
Aluno aluno = (Aluno) obj;
return Objects.equals(nome, aluno.nome);
}
}
public class TestandoListas {
public static void main(String[] args) {
List<Aluno> alunos = new ArrayList<>();
Aluno aluno1 = new Aluno("João");
Aluno aluno2 = new Aluno("Maria");
alunos.add(aluno1);
alunos.add(aluno2);
Aluno aluno3 = new Aluno("João");
System.out.println(alunos.contains(aluno3)); // true, pois aluno3 é igual a aluno1
}
}Acessando elementos
E se eu quisesse saber apenas a primeira aula? O método aqui é o get. Ele retorna o primeiro elemento se passarmos o 0 como argumento:
String primeiraAula = aulas.get(0);
System.out.println("A primeira aula é " + primeiraAula);Você pode usar esse mesmo método para percorrer a lista toda, em vez do foreach. Para isso, precisamos saber quantos elementos temos nessa lista. Nesse caso, utilizamos o método size para limitar o nosso for:
for (int i = 0; i < aulas.size(); i++) {
System.out.println("aula : " + aulas.get(i));
}Mais uma forma de percorrer elementos, agora com Java 8
Uma outra forma de percorrer nossa lista é utilizando as sintaxes e métodos novos incluídos no Java 8. Temos um método (não um comando!) agora que se chama forEach. Ele recebe um objeto do tipo Consumer, mas o interessante é que você não precisa criá-lo, você pode utilizar uma sintaxe bem mais enxuta, mas talvez assustadora a primeira vista, chamada lambda. Repare:
aulas.forEach(aula -> {
System.out.println("Percorrendo:");
System.out.println("Aula " + aula);
});Exemplo sistema banco
public class Conta {
private int numero;
private String cliente;
private double saldo;
private double limite;
//
Conta(int numero, String cliente) {
if (numero < 0) {
this.numero = 999;
} else {
this.numero = numero;
}
setCliente(cliente);
this.saldo = 0;
this.limite = 100;
}
public Conta(int numero, String cliente, double saldo, double limite) {
this(numero, cliente);
this.saldo = saldo;
this.limite = limite;
}
public void setCliente(String cliente) {
if (cliente != null && !cliente.isEmpty() && !cliente.isBlank()) {
this.cliente = cliente;
}else{
this.cliente = "GERENTE";
}
}
public boolean saca(double quantidade) {// método
if (this.saldo < quantidade) {
return false;
} else {
this.saldo -= quantidade;
return true;
}
}
public void deposita(double quantidade) {// método
this.saldo += quantidade;
}
public boolean transferir(Conta destino, double valor) {
if (this.saca(valor)) {
destino.deposita(valor);
return true;
}
return false;
}
public int getNumero() {
return numero;
}
public double getLimite() {
return limite;
}
public String getCliente() {
return cliente;
}
public double getSaldo() {
return saldo;
}
@Override
public String toString() {
return String.format("Conta [numero= %d, cliente= %s, saldo= %.2f]", numero, cliente, saldo);
}
}
import java.util.ArrayList;
import java.util.List;
public class Agencia {
private int numero;
private ArrayList<Conta> contas;
public Agencia(int numero) {
this.numero = numero;
contas = new ArrayList<>();
}
public int getNumero() {
return numero;
}
public int criarConta(String cliente) {
// calcula o numero da nova conta
int numeroConta = numero * 100;
numeroConta += contas.size();
// instancia nova conta com o numero calculado
Conta novConta = new Conta(numeroConta, cliente);
// guardo nova conta na minha lista de contas
contas.add(novConta);
// devolvo a conta para quem pediu
return novConta.getNumero();
}
public int totalContas() {
return contas.size();
}
public double totalDinheiro() {
double total = 0;
for (Conta conta : contas) {
total += conta.getSaldo();
}
return total;
}
public Conta getConta(int numeroConta) {
// buscar a conta que tem o numero igual a numeroConta
for (Conta conta : contas) {
if (conta.getNumero() == numeroConta) {
return conta;
}
}
return null;
}
}
public class App {
public static void main(String[] args) throws Exception {
Agencia ag1 = new Agencia(2);
int numeroConta1 = ag1.criarConta("Leandro");
IO.println("Numero da contra de Leandro :" + numeroConta1);
int numeroConta2 = ag1.criarConta("Isabela");
IO.println("Numero da contra de Isabela :" + numeroConta2);
Conta conta1 = ag1.getConta(numeroConta1);
Conta conta2 = ag1.getConta(numeroConta2);
// Somente mesmo pacote pode chamar o new
// Conta conta3 = new Conta("Nome");//erro em classes de outro pacote
conta1.deposita(100.0);
conta2.deposita(10.0);
conta1.transferir(conta2, 50);
IO.println(conta1.toString());
IO.println(conta2);
IO.println(String.format("Total de Contas: %d", ag1.totalContas()));
IO.println(String.format("Total de Dinheiro: %.2f", ag1.totalDinheiro()));
}
}Get com listas
public ArrayList<Conta> getContas() {
return contas;
}
//main
agencia.getContas().add(new Conta())//?
import java.util.List;
//...
public List<Conta> getContas() {
return List.copyOf(contas);
}
//main
agencia.getContas().add(new Conta())//?Exercícios
Referências
Java Collections: Dominando Listas, Sets e Mapas. https://www.alura.com.br/conteudo/java-collections--amp. (Acessado em 21/10/2022) ↩︎