1. Introdução
Esta é a primeira aula de um nível bônus. Já estamos muito próximos de estudar POO. E eu quero aguçar seu interesse e adiantar um pouco o assunto 😈. Neste nível, vou falar sobre 5 coisas interessantes:
- ♾️ Você vai aprender a criar arrays infinitos
- 📖 Depois, a manter um “dicionário pessoal”
- 💾 Em seguida, vou apresentar rapidamente o trabalho com arquivos
- 🌐 Depois vamos aprender a baixar imagens da internet
- 🛰️ E, na última aula do nível, você vai acompanhar a estação espacial ISS em tempo real
Como tudo isso funciona por baixo do capô, você vai descobrir em níveis futuros; hoje você simplesmente vai aprender a usar as ferramentas que forneci. Ficou curioso? Então vamos começar 😇.
Relembrando arrays comuns
Vamos relembrar um array comum em Java:
int[] arr = new int[10];
É ótimo, mas tem algumas limitações: o tamanho é fixo; não dá para adicionar ou remover um elemento sem criar um novo array. E às vezes queremos um array que cresça e diminua conforme necessário. E temos uma ótima solução — o array dinâmico ArrayList!
ArrayList é um “array inteligente” que pode crescer e diminuir automaticamente. Ao contrário de um array comum, em que o tamanho é fixo, o ArrayList cuida sozinho para que haja espaço suficiente para novos elementos.
Criando um array infinito
Para criar nosso ArrayList, escreva um código como:
ArrayList<String> array = new ArrayList<String>()
Depois disso, você pode adicionar elementos a ele:
array.add("Masha");
array.add("Katya");
Criando um array dinâmico para números inteiros
Como você já deve ter percebido, o tipo dos elementos do nosso array dinâmico precisa ser informado entre os colchetes angulares. Você pode indicar qualquer tipo, exceto os tipos primitivos. Os tipos primitivos precisam ser substituídos por suas classes wrapper.
Exemplo:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
Nosso ArrayList não suporta [index] para acessar os elementos, mas ele possui métodos especializados que cobrem todas as suas necessidades. Vamos passar pelos mais interessantes.
2. Método add(element) — adicionar um elemento
A primeira coisa que fazemos com uma lista é adicionar dados a ela. Para isso serve o método add. Ele coloca o elemento no final da lista.
ArrayList<String> todo = new ArrayList<>(); // lista de tarefas
todo.add("Aprender ArrayList");
todo.add("Fazer chá");
todo.add("Dar um passeio");
Depois dessas três linhas, temos uma lista de três strings. Diferente de um array, não precisamos informar o tamanho com antecedência — ele cresce conforme vamos adicionando.
Muito conveniente: você pode começar com uma lista vazia e ir preenchendo aos poucos, dependendo das ações do usuário ou dos dados de entrada do programa.
3. Método get(index) — acesso por índice
Cada elemento da lista tem seu número ordinal — o índice. A indexação sempre começa em zero. Ou seja, o primeiro elemento está no número 0, o segundo no número 1 e assim por diante.
Se quisermos obter um elemento pelo número, usamos o método get.
String task = todo.get(1);
System.out.println("Segunda tarefa: " + task);
Saída:
Segunda tarefa: Fazer chá
É importante lembrar: se você acessar um índice que não existe (por exemplo, todo.get(10) em uma lista com três elementos), o programa lançará o erro IndexOutOfBoundsException. Por isso, sempre é preciso ter certeza do índice ou verificar o tamanho da lista com size().
4. Método set(index, element) — substituir um elemento
Às vezes precisamos substituir um elemento na lista. Nesse caso, não é necessário remover e adicionar novamente — basta usar o método set.
todo.set(1, "Fazer café");
System.out.println("Agora a segunda tarefa: " + todo.get(1));
Saída:
Agora a segunda tarefa: Fazer café
Assim, set é uma forma de atualizar a lista “na hora”.
5. Método remove(index) — remover um elemento
Você pode remover um elemento de ArrayList pelo índice.
todo.remove(0);
System.out.println("A primeira tarefa agora: " + todo.get(0));
Saída:
A primeira tarefa agora: Fazer café
Removemos o primeiro elemento (índice 0). Agora o segundo virou o primeiro, e o que antes era o terceiro virou o segundo. Ponto importante: após a remoção, os elementos da lista são deslocados.
Isso às vezes pode surpreender iniciantes. Sempre leve em conta que, depois da remoção, os índices são recalculados.
6. Método size() — obter o tamanho da lista
O método size retorna a quantidade de elementos na lista. Isso é parecido com a propriedade length em arrays, mas em ArrayList é um método.
System.out.println("Total de tarefas: " + todo.size());
Saída:
Total de tarefas: 2
Com frequência, size é usado em laços para percorrer todos os elementos:
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. Método contains(element) — verificação de existência
Para saber se a lista contém um elemento desejado, você pode usar contains. Esse método retorna true ou false.
System.out.println(todo.contains("Dar um passeio"));
System.out.println(todo.contains("Fazer chá"));
Saída:
true
false
Método muito útil quando você quer evitar duplicatas ou verificar a condição “existe tal elemento na lista?”.
8. Percorrendo elementos
Há duas maneiras de percorrer a lista.
Laço indexado
Esse método é necessário se o número do elemento for importante.
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
Laço for-each
Se o número não for necessário e você apenas quiser ver todos os elementos — use o laço for-each.
for (String task : todo)
{
System.out.println("Tarefa: " + task);
}
Esse laço é mais curto e mais fácil de ler.
9. Prática: ArrayList no seu aplicativo
Vamos fazer uma lista de tarefas que pode ser incrementada e exibida:
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Digite uma tarefa (ou uma linha vazia para sair): ");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("Sua lista de tarefas:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
Espero que você tenha gostado do nosso array infinito. Ele é a primeira das coleções do Java com a qual você teve contato. Acho que você também vai gostar das outras.
GO TO FULL VERSION