Hytale Modding
Основи 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<>();

Узагальнюючі класи:

  • intInteger
  • doubleDouble
  • booleanBoolean
  • charCharacter

Загальні методи 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

Практичні вправи

  1. Кошик для покупок: Створіть систему кошика для покупок:

    • Додавання елементів
    • Видалення елементів
    • Обчислення загальної кількості елементів
    • Очищення кошика
  2. Список друзів: Створіть систему управління друзями:

    • Додавання друга
    • Видалення друга
    • Перевірка, чи є хтось другом
    • Відобразити всіх друзів
  3. Список справ: Створити список справ:

    • Додавання завдання
    • Позначення завдання як виконане (перемістити до списку виконаних завдань)
    • Відобразити активні завдання
    • Відобразити виконані завдання
  4. Найкращі результати: Створити систему найкращих результатів:

    • Додавання результатів
    • Відобразити 5 найкращих результатів по порядку
    • Видалити найнижчий результат, якщо існує більше 10 результатів