Моддинг Hytale
Основы Java

05 - Массивы

Вы узнаете, как хранить и управлять наборами данных с помощью массивов.

Массивы позволяют хранить несколько значений одного типа в одной переменной. Представьте себе массив как множество коробок, в каждой из которых находится предмет.

Создание Массивов

Метод 1: Объявлять и инициализировать по отдельности

int[] numbers;           // Объявим массив
numbers = new int[5];    // Далее добавляем в него пять пустых "коробок"

Метод 2: Всё вместе

int[] numbers = new int[5];

Метод 3: Создать массив с "начальными" значениями

int[] numbers = {10, 20, 30, 40, 50};
Размер Массива

Как только вы создадите массив его будет зафиксирован. Это означает, что вы не сможете добавлять или удалять элементы в будущем!

int[] inventory = new int[9];  // Этот массив всегда будет содержать только 9 слотов

Использование Элементов Массива

Массивы используют номер индекса, который всегда начинается с 0:

String[] players = {"Алиса", "Боб", "Чарли"};

System.out.println(players[0]); // "Алиса"
System.out.println(players[1]); // "Боб"
System.out.println(players[2]); // "Чарли"

Визуализация

Индекс012
Значение"Алиса""Боб""Чарли"

Изменение значений массива

int[] health = {100, 80, 90};

health[1] = 60;  // Значение здоровья Боба было изменено с 80 на 60
System.out.println(health[0]); // 100
System.out.println(health[1]); // 60
System.out.println(health[2]); // 90

Длина Массива

Для получения размера массива можно использовать .length:

int[] scores = {45, 67, 89, 92, 55};
System.out.println(scores.length); // 5
Length - не метод

Обратите внимание, мы не используем скобки после lengh! Мы пишем array.length, не array.length().

Циклы и Массивы

Использование цикла For

String[] items = {"Меч", "Щит", "Зелье"};

for (int i = 0; i < items.length; i++) {
    System.out.println(items[i]);
}

Использование расширенного цикла For (For-Each)

String[] items = {"Меч", "Щит", "Зелье"};

for (String item : items) {
    System.out.println(item);
}
Расширенный цикл For

Расширенный цикл for прост и безопасен в использовании, но вы не сможете менять значение элементов массива и узнать их индекс.

// Когда вам нужен индекс
for (int i = 0; i < items.length; i++) {
    System.out.println(i + ": " + items[i]);
}

// Когда вам нужно просто значение
for (String item : items) {
    System.out.println(item);
}

Многомерный массив

Массивы могут состоять из других массивы, тем самым создавая таблицу:

int[][] grid = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

System.out.println(grid[0][0]); // 1
System.out.println(grid[1][2]); // 6
System.out.println(grid[2][1]); // 8

Визуализация

012
0123
1456
2789

Зацикливание 2D массивов

int[][] grid = {
    {1, 2, 3},
    {4, 5, 6}
};

for (int row = 0; row < grid.length; row++) {
    for (int col = 0; col < grid[row].length; col++) {
        System.out.print(grid[row][col] + " ");
    }
    System.out.println();
}

Практические примеры

Система инвентаря игрока

String[] inventory = new String[9]; // 9 слотов в хотбаре

// Добавляем предметы
inventory[0] = "Diamond Sword";
inventory[1] = "Shield";
inventory[8] = "Food";

// Просмотриваем инвентарь
for (int i = 0; i < inventory.length; i++) {
    if (inventory[i] != null) {
        System.out.println("Slot " + i + ": " + inventory[i]);
    } else {
        System.out.println("Slot " + i + ": Empty");
    }
}

Найти максимум среди чисел в массиве

int[] scores = {45, 92, 67, 88, 55, 71};
int highest = scores[0];

for (int i = 1; i < scores.length; i++) {
    if (scores[i] > highest) {
        highest = scores[i];
    }
}

System.out.println("Самый высокий балл: " + highest);

Вычислить среднее арифметическое

double[] temperatures = {23.5, 25.0, 22.8, 24.3, 26.1};
double sum = 0;

for (double temp : temperatures) {
    sum += temp;
}

double average = sum / temperatures.length;
System.out.println("Средняя температура: " + average);

Блочная сетка (2D массив)

String[][] terrain = new String[5][5];

// Заполняем ячейки травой
for (int x = 0; x < 5; x++) {
    for (int z = 0; z < 5; z++) {
        terrain[x][z] = "grass";
    }
}

// Добавляем камень (minecraft референс)
terrain[2][2] = "stone";
terrain[1][3] = "stone";

// Просматриваем сетку
for (int x = 0; x < terrain.length; x++) {
    for (int z = 0; z < terrain[x].length; z++) {
        System.out.print(terrain[x][z] + " ");
    }
    System.out.println();
}

Частые операции с массивом

Скопировать массив

int[] original = {1, 2, 3, 4, 5};
int[] copy = original.clone();

// Можно и вручную
int[] copy2 = new int[original.length];
for (int i = 0; i < original.length; i++) {
    copy2[i] = original[i];
}

Найти значение

String[] items = {"Меч", "Щит, "Зелье", "Лук"};
String target = "Зелье";
int foundIndex = -1;

for (int i = 0; i < items.length; i++) {
    if (items[i].equals(target)) {
        foundIndex = i;
        break;
    }
}

if (foundIndex != -1) {
    System.out.println("Найден индекс элемента: " + foundIndex);
} else {
    System.out.println("Ничего не найдено");
}

Счетчик событий

String[] blocks = {"stone", "dirt", "stone", "grass", "stone"};
String searchFor = "stone";
int count = 0;

for (String block : blocks) {
    if (block.equals(searchFor)) {
        count++;
    }
}

System.out.println(searchFor + " appears " + count + " times")

Ограничения массивов

Фиксированный размер

Массивы не могут увеличиваться или уменьшаться. Если вам нужно что-то более гибкое позже вам расскажут о ArrayList!

int[] numbers = new int[5];
// Вы не можете добавить 6-ой элемент!

// Если вам нужно больше места, придётся создать новый массив
int[] bigger = new int[10];
for (int i = 0; i < numbers.length; i++) {
    bigger[i] = numbers[i];
}