Основи Java
10 - ArrayList та колекції
Навчіться використовувати гнучкі колекції з можливістю зміни розміру в Java.
Масиви мають фіксований розмір, але що робити, якщо вам потрібно додати або видалити елементи? Тут на допомогу приходить ArrayList - колекція з можливістю зміни розміру, яка автоматично збільшується та зменшується.
Основи ArrayList
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// Створення ArrayList рядків
ArrayList<String> players = new ArrayList<>();
// Додавання елементів
players.add("Анна");
players.add("Богдан");
players.add("Василь");
System.out.println(players); // [Анна, Богдан, Василь]
}
}ArrayList проти масиву
| Масив | ArrayList |
|---|---|
| Фіксований розмір | Змінюваний розмір (збільшується/зменшується) |
| Може містити примітивні типи (int, double тощо) | Може містити тільки об'єкти (Integer, Double, String тощо) |
| Швидший доступ | Більше функцій (додавання, видалення тощо) |
int[] numbers = new int[10]; | ArrayList<Integer> numbers = new ArrayList<>(); |
Створення ArrayList
import java.util.ArrayList;
// Порожній ArrayList
ArrayList<String> items = new ArrayList<>();
// З початковими значеннями (Java 9+)
ArrayList<String> colors = new ArrayList<>(List.of("Червоний", "Зелений", "Синій"));
// Різні типи
ArrayList<Integer> numbers = new ArrayList<>();
ArrayList<Double> prices = new ArrayList<>();
ArrayList<Boolean> flags = new ArrayList<>();Примітивні типи в ArrayList
Не можна використовувати примітивні типи безпосередньо. Використовуйте їхні узагальнюючі класи:
// Неправильно
ArrayList<int> numbers = new ArrayList<>();
// Правильно - використовує узагальнюючий клас
ArrayList<Integer> numbers = new ArrayList<>();Узагальнюючі класи:
int→Integerdouble→Doubleboolean→Booleanchar→Character
Загальні методи ArrayList
Додавання елементів
ArrayList<String> items = new ArrayList<>();
items.add("Меч"); // Додається в кінець
items.add("Щит");
items.add(0, "Шолом"); // Додається в вказану позицію
System.out.println(items); // [Шолом, Меч, Щит]Доступ до елементів
ArrayList<String> items = new ArrayList<>();
items.add("Меч");
items.add("Щит");
String first = items.get(0); // "Меч"
String second = items.get(1); // "Щит"
int size = items.size(); // 2Видалення елементів
ArrayList<String> items = new ArrayList<>();
items.add("Меч");
items.add("Щит");
items.add("Зілля");
items.remove(1); // Видалити за індексом (Щит)
items.remove("Зілля"); // Видалення за значенням
System.out.println(items); // [Меч]Перевірка вмісту
ArrayList<String> items = new ArrayList<>();
items.add("Меч");
items.add("Щит");
boolean hasSword = items.contains("Меч"); // true
boolean hasAxe = items.contains("Сокира"); // false
boolean isEmpty = items.isEmpty(); // false
int size = items.size(); // 2Модифікація елементів
ArrayList<String> items = new ArrayList<>();
items.add("Дерев'яний меч");
items.set(0, "Залізний меч"); // Заміна в індексі 0
System.out.println(items); // [Залізний меч]Очищення всіх елементів
ArrayList<String> items = new ArrayList<>();
items.add("Меч");
items.add("Щит");
items.clear(); // Видалити все
System.out.println(items); // []Проходження циклом по ArrayList
Використання циклу for
ArrayList<String> players = new ArrayList<>();
players.add("Анна");
players.add("Богдан");
players.add("Василь");
for (int i = 0; i < players.size(); i++) {
System.out.println(players.get(i));
}Використання розширеного циклу for
for (String player : players) {
System.out.println(player);
}Використання forEach (Java 8+)
players.forEach(player -> System.out.println(player));Практичні приклади
Система інвентарю гравця
import java.util.ArrayList;
public class Inventory {
private ArrayList<String> items;
private int maxSize;
public Inventory(int maxSize) {
this.items = new ArrayList<>();
this.maxSize = maxSize;
}
public boolean addItem(String item) {
if (items.size() >= maxSize) {
System.out.println("Інвентар повний!");
return false;
}
items.add(item);
System.out.println("Додано: " + item);
return true;
}
public boolean removeItem(String item) {
if (items.remove(item)) {
System.out.println("Видалено: " + item);
return true;
}
System.out.println("Предмет не знайдено!");
return false;
}
public void displayInventory() {
System.out.println("=== Інвентар (" + items.size() + "/" + maxSize + ") ===");
for (int i = 0; i < items.size(); i++) {
System.out.println((i + 1) + ". " + items.get(i));
}
}
public int getItemCount() {
return items.size();
}
public boolean isFull() {
return items.size() >= maxSize;
}
}
// Використання
public class Main {
public static void main(String[] args) {
Inventory inv = new Inventory(5);
inv.addItem("Меч");
inv.addItem("Щит");
inv.addItem("Зілля");
inv.displayInventory();
inv.removeItem("Щит");
inv.displayInventory();
}
}Система завдань
import java.util.ArrayList;
public class QuestManager {
private ArrayList<String> activeQuests;
private ArrayList<String> completedQuests;
public QuestManager() {
this.activeQuests = new ArrayList<>();
this.completedQuests = new ArrayList<>();
}
public void startQuest(String questName) {
if (!activeQuests.contains(questName)) {
activeQuests.add(questName);
System.out.println("Завдання розпочато: " + questName);
} else {
System.out.println("Завдання вже активне!");
}
}
public void completeQuest(String questName) {
if (activeQuests.remove(questName)) {
completedQuests.add(questName);
System.out.println("Завдання завершенно: " + questName);
} else {
System.out.println("Завдання не знайдено в списку активних!");
}
}
public void displayQuests() {
System.out.println("\n=== Активні завдання ===");
if (activeQuests.isEmpty()) {
System.out.println("Немає активних завдань");
} else {
for (String quest : activeQuests) {
System.out.println("- " + quest);
}
}
System.out.println("\n=== Завершені завдання ===");
if (completedQuests.isEmpty()) {
System.out.println("Немає завершених завдань");
} else {
for (String quest : completedQuests) {
System.out.println("" + quest);
}
}
}
public int getTotalCompleted() {
return completedQuests.size();
}
}Система лідерів
import java.util.ArrayList;
import java.util.Collections;
public class Leaderboard {
private ArrayList<Integer> scores;
private ArrayList<String> players;
public Leaderboard() {
this.scores = new ArrayList<>();
this.players = new ArrayList<>();
}
public void addScore(String player, int score) {
players.add(player);
scores.add(score);
System.out.println(player + " набрав " + score + " балів!");
}
public void displayTop(int count) {
System.out.println("\n=== Топ " + count + " гравців ===");
// Створення копії для сортування
ArrayList<Integer> sortedScores = new ArrayList<>(scores);
ArrayList<String> sortedPlayers = new ArrayList<>(players);
// Сортування бульбашкою (просте для вивчання)
for (int i = 0; i < sortedScores.size() - 1; i++) {
for (int j = 0; j < sortedScores.size() - i - 1; j++) {
if (sortedScores.get(j) < sortedScores.get(j + 1)) {
// Обмін балів
int tempScore = sortedScores.get(j);
sortedScores.set(j, sortedScores.get(j + 1));
sortedScores.set(j + 1, tempScore);
// Обмін гравців
String tempPlayer = sortedPlayers.get(j);
sortedPlayers.set(j, sortedPlayers.get(j + 1));
sortedPlayers.set(j + 1, tempPlayer);
}
}
}
// Відобразити найкращі результати
int limit = Math.min(count, sortedScores.size());
for (int i = 0; i < limit; i++) {
System.out.println((i + 1) + ". " + sortedPlayers.get(i) +
" - " + sortedScores.get(i) + " балів");
}
}
}Відстеження гравців онлайн
import java.util.ArrayList;
public class OnlinePlayersTracker {
private ArrayList<String> onlinePlayers;
public OnlinePlayersTracker() {
this.onlinePlayers = new ArrayList<>();
}
public void playerJoin(String playerName) {
if (!onlinePlayers.contains(playerName)) {
onlinePlayers.add(playerName);
broadcast(playerName + " приєднався до гри");
updatePlayerCount();
}
}
public void playerLeave(String playerName) {
if (onlinePlayers.remove(playerName)) {
broadcast(playerName + " залишив гру");
updatePlayerCount();
}
}
public boolean isOnline(String playerName) {
return onlinePlayers.contains(playerName);
}
public int getPlayerCount() {
return onlinePlayers.size();
}
public void listPlayers() {
System.out.println("\n=== Гравці онлайн (" + getPlayerCount() + ") ===");
for (String player : onlinePlayers) {
System.out.println("• " + player);
}
}
private void broadcast(String message) {
System.out.println("[Сервер] " + message);
}
private void updatePlayerCount() {
System.out.println("Гравців онлайн: " + getPlayerCount());
}
}ArrayList користувацьких об'єктів
Ви можете зберігати власні класи в ArrayList:
public class Player {
private String name;
private int level;
public Player(String name, int level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public int getLevel() {
return level;
}
@Override
public String toString() {
return name + " (Рів. " + level + ")";
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Player> players = new ArrayList<>();
players.add(new Player("Анна", 10));
players.add(new Player("Богдан", 15));
players.add(new Player("Василь", 8));
// Відобразити всіх гравців
for (Player player : players) {
System.out.println(player);
}
// Знайти гравця за іменем
for (Player player : players) {
if (player.getName().equals("Богдан")) {
System.out.println("Знайдено: " + player);
}
}
}
}Корисні операції з ArrayList
Перетворення в масив
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
String[] array = list.toArray(new String[0]);Перетворення масиву в ArrayList
String[] array = {"A", "B", "C"};
ArrayList<String> list = new ArrayList<>(Arrays.asList(array));Копіювання ArrayList
ArrayList<String> original = new ArrayList<>();
original.add("A");
original.add("B");
// Поверхневе копіювання
ArrayList<String> copy = new ArrayList<>(original);Пошук індексу елемента
ArrayList<String> items = new ArrayList<>();
items.add("Меч");
items.add("Щит");
int index = items.indexOf("Щит"); // 1
int notFound = items.indexOf("Сокира"); // -1Практичні вправи
-
Кошик для покупок: Створіть систему кошика для покупок:
- Додавання елементів
- Видалення елементів
- Обчислення загальної кількості елементів
- Очищення кошика
-
Список друзів: Створіть систему управління друзями:
- Додавання друга
- Видалення друга
- Перевірка, чи є хтось другом
- Відобразити всіх друзів
-
Список справ: Створити список справ:
- Додавання завдання
- Позначення завдання як виконане (перемістити до списку виконаних завдань)
- Відобразити активні завдання
- Відобразити виконані завдання
-
Найкращі результати: Створити систему найкращих результатів:
- Додавання результатів
- Відобразити 5 найкращих результатів по порядку
- Видалити найнижчий результат, якщо існує більше 10 результатів