Массивы

Задачи, для решения которых нужно понимать синтаксис и правила работы с массивами в Java. Уметь обращаться к конкретным элементам массива, итеративно перебирать все элементы и т.д.

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

Задача 1

Дана строка "Hello, World!". Необходимо разбить эту строку на две части методом split(",") и вывести первую часть в консоль. Всю инструкцию необходимо уместить в одну строку.

Для решения задачи достаточно помнить, что оператор взятия элемента массива [] может использоваться в любом месте, где у нас возникает массив, в том числе сразу после вызова метода, возвращающего этот массив.

Таким образом, решение может быть таким:

System.out.println( "Hello, World!".split(",")[0] ); //Hello

Поскольку метод split возвращает массив, нам совершенно необязательно сохранять ссылку на этот массив в какую-то переменную, чтобы получить доступ к его элементам. Можно сразу после закрывающей скобки метода использовать оператор взятия элемента массива [] с необходимым индексом (в нашем случае — 0).

Отметим, что при таком использовании [] мы рискуем получить java.lang.ArrayIndexOutOfBoundsException, если не угадаем с индексом.

Например, так:

System.out.println( "Hello, World!".split(",")[2] ); //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2

Задача 2

Дан двумерный массив двузначных чисел:

Integer[][] matrix = {

{23, 73, 15},

{56, 33, 21},

{34, 78, 87},

{22, 90, 74},

{76, 89, 55}

};

Напишите метод со следующей сигнатурой: void printMatrix(Object[][] matrix), который бы выводил содержимое массива в консоль.

Первый индекс двумерного массива указывает строку, а второй — столбец. Таким образом нужно организовать сложенный цикл, который бы итерировал строки, а внутри строк столбцы. При этом данные из столбцов нужно выводит в строчку с пробелом, а данные из строк разделять переносом строки. Тогда решение может выглядеть так:

static void printMatrix(Object[][] matrix) {


for (int y = 0; y < matrix.length; y++) {


for (int x = 0; x < matrix[0].length; x++) {


System.out.print(matrix[y][x] + " "); //внутри строки

}

System.out.println(); //переход на новую строку

}

}

Задача 3

Дан двумерный массив двузначных чисел, моделирующий матрицу:

Integer[][] matrix = {

{23, 73, 15},

{56, 33, 21},

{34, 78, 87},

{22, 90, 74},

{76, 89, 55}

};

Напишите метод Object[][] transponeMatrix(Object[][] original), который бы транспонировал данную матрицу, то есть превратил первую строку исходной матрицы в первый столбец целевой, вторую строку — во второй столбец и так далее, и возвращал результат транспонирования в виде массива.

Напишите метод, который бы выводил полученный двумерный массив в консоль (если ещё не написали). Результат работы метода, применённого к данным из примера должен быть таким:

23 56 34 22 76

73 33 78 90 89

15 21 87 74 55

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

static Object[][] transponeMatrix(Object[][] original) {


int xAxis = original.length;

int yAxis = original[0].length;


if (xAxis == 0 || yAxis == 0) {

throw new IllegalArgumentException("Одно из измерений массива равно нулю.");

}


Object[][] transponed = new Object[yAxis][xAxis];


for (int x = 0; x < xAxis; x++) {


for (int y = 0; y < yAxis; y++) {


transponed[y][x] = original[x][y];


}

}


return transponed;

}

Задача 4

Дан одномерный массив целых чисел: int[] nums = {1,2,3,4,5};

Напишите метод boolean contains(int[] numArray, int num), который принимает в качестве первого аргумента собственно массив целых чисел, а в качестве второго просто целое число и возвращает true, если такое число встречается в массиве и false, если нет.

Задача тривиальна, элементы массива необходимо перебрать в цикле и каждый сравнить с вторым аргументом метода. Если встретится совпадение, то вернуть true, если нет, то по умолчанию возвращаем false:

static boolean contains(int[] numArray, int num) {

for (int i = 0; i < numArray.length; i++) {


if (numArray[i] == num) {

return true;

}

}

return false;

}

Задача 5

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

Результат должен иметь следующий вид:

1 2 3 4 5 6 7 8 9 10

2 4 6 8 10 12 14 16 18 20

3 6 9 12 15 18 21 24 27 30

4 8 12 16 20 24 28 32 36 40

5 10 15 20 25 30 35 40 45 50

6 12 18 24 30 36 42 48 54 60

7 14 21 28 35 42 49 56 63 70

8 16 24 32 40 48 56 64 72 80

9 18 27 36 45 54 63 72 81 90

10 20 30 40 50 60 70 80 90 100

То есть при выводе чисел должно быть проведено минимальное форматирование таблицы. Между числами должны быть поставлены пробелы таким образом, чтобы таблица получилась "ровной".

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

Чтобы таблица получилась ровной, достаточно учесть тот факт, что все произведения (кроме 10×10) представляют собой либо однозначные, либо двузначные числа. Если сделать расстояние от однозначного числа до любого следующего в два пробела, а расстояние от двузначного до следующего в один пробел, то таблица получится ровной.

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

Решение может выглядеть так:

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

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


for (int i = 0; i < 10; i++) {

for (int j = 0; j < 10; j++) {


if (x[i] * y[j] < 10) {

System.out.print(" ");

} else {

System.out.print(" ");

}


System.out.print(x[i] * y[j]);

}

System.out.println();

}

Задача 6

Дана строка с произвольным текстом без знаков препинания.

Напишите код, который выведет в консоль слова этого текста в обратном порядке. Например,
фраза Java is my favourite programming language
превращается в language programming favourite my is Java

Используйте метод split(" ") на объекте класса String, чтобы превратить строку в массив символов.

Простейшее решение может выглядеть так:

public static void main(String[] args) {


String orig = "Java is my favourite programming language";

String goal = "";

String[] words = orig.split(" ");


for (int i = words.length - 1; i >= 0; i--) {

goal += words[i] + " ";

}


System.out.println(goal);

}

Строка String[] words = orig.split(" "); превратит текст в массив слов, разделив его по пробелам.

Ключевой момент заключается в том, чтобы прочитать полученный массив в обратном порядке. Для этого нужно правильно написать управляющий оператор for. Счётчик цикла i инициализируется индексом последнего элемента массива: int i = words.length - 1; Массив итерируется, пока i не достигнет 0 (элемент с индексом 0 -- первый в массиве). Значение i уменьшается на единицу в каждой итерации.

Таким образом, оператор for должен выглядеть следующим образом:

for (int i = words.length - 1; i >= 0; i--).

Также составляя итоговую строку, нужно не забыть проставить пробелы между словами:

goal += words[i] + " ";