Java объявление массива в методе. Изучаем Java

  • 21.09.2019
  • Tutorial

Думаю, мало кто из готовящихся к своему первому интервью, при приеме на первую работу в должности (pre)junior программиста, ответит на этот вопрос отрицательно. Или хотя бы усомнится в положительном ответе. Конечно, такая простая структура данных с прямым доступом по индексу - никаких подвохов! Нет, в некоторых языках типа JavaScript или PHP массивы, конечно, реализованы очень интересно и по сути являются много большим чем просто массив. Но речь не об этом, а о «традиционной» реализации массивов в виде «сплошного участка памяти». В этом случае на основании индексов и размера одного элемента просто вычисляется адрес и осуществляется доступ к соответствующему значению. Что тут сложного?
Давайте разберемся. Например, на Java. Просим ничего не подозревающего претендента создать массив целых чисел n x n . Человек уверено пишет что-то в духе:
int g = new int[n][n];
Отлично. Теперь просим инициализировать элементы массива чем-нибудь. Хоть единицами, хоть суммой индексов. Получаем:
for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
Даже чаще пишут
for(int i = 0; i < g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
что тоже повод для беседы, но сейчас речь о другом. Мы ведь пытаемся выяснить, что человек знает и посмотреть, как он думает. По этому обращаем его внимание на тот факт, что значения расположены симметрично и просим сэкономить на итерациях циклов. Конечно, зачем пробегать все значения индексов, когда можно пройти только нижний треугольник? Испытуемый обычно легко соглашается и мудро выделяя главную диагональ старательно пишет что-то в духе:
for(int i = 0; i < n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
Вместо g[i][i] = 2* i; часто пишут g[i][i] = i + i; или g[i][i] = i << 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: На сколько быстрее станет работать программа? . Обычные рассуждения такие: почти в 2 раза меньше вычислений индексов; почти в 2 раза меньше вычислений значений (суммирование); столько же присваиваний. Значит быстрее процентов на 30. Если у человека за плечами хорошая математическая школа, то можно даже увидеть точное количество сэкономленных операций и более аргументированную оценку эффективности оптимизации.
Теперь самое время для главного удара. Запускаем оба варианта кода на каком-нибудь достаточно большом значении n (порядка нескольких тысяч), например, так .

Код с контролем времени

class A { public static void main(String args) { int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


Что же мы видим? Оптимизированный вариант работает в 10-100 раз медленнее! Теперь самое время понаблюдать за реакцией претендента на должность. Какая будет реакция на необычную (точнее обычную в практике разработчика) стрессовую ситуацию. Если на лице подзащитного изобразился азарт и он стал жать на кнопочки временно забыв о Вашем существовании, то это хороший признак. До определенной степени. Вы ведь не хотите взять на работу исследователя, которому плевать на результат проекта? Тогда не задавайте ему вопрос «Почему?». Попросите переделать второй вариант так, чтобы он действительно работал быстрее первого.
Теперь можно смело заниматься некоторое время своими делами. Через пол часа у Вас будет достаточно материала, для того, чтобы оценить основные личностные и профессиональные качества претендента.
Кстати, когда я коротко описал эту задачку на своем рабочем сайте, то наиболее популярный комментарий был «Вот такая эта Ваша Java кривая». Специально для них выкладываю код на Великом и Свободном. А счастливые обладатели Free Pascal под Windows могут заглянуть

под спойлер

program Time; uses Windows; var start, finish, res: int64; n, i, j: Integer; g: Array of Array of Integer; begin n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(finish); writeln("Time by rows:", (finish - start) / res, " sec"); QueryPerformanceCounter(start); for i:=1 to n-1 do for j:=1 to n-1 do g := i + j; QueryPerformanceCounter(finish); writeln("Time by cols:", (finish - start) / res, " sec"); end.


В приведенном коде на Паскале я убрал «запутывающие» моменты и оставил только суть проблемы. Если это можно назвать проблемой.
Какие мы в итоге получаем вопросы к подзащитному?
1. Почему стало работать медленнее? И поподробнее…
2. Как сделать инициализацию быстрее?

Если есть необходимость копнуть глубже именно в реализацию Java, то просим соискателя понаблюдать за временем выполнения для небольших значений n . Например, на ideone.com для n=117 «оптимизированный» вариант работает вдвое медленнее. Но для следующего значения n=118 он оказывается уже в 100 (сто) раз быстрее не оптимизированного! Предложите поэкспериментировать на локальной машине. Пусть поиграет с настройками.
Кстати, а всем понятно, что происходит?

Несколько слов в оправдание

Хочу сказать несколько слов в оправдание такого способа собеседования при найме. Да, я не проверяю знание синтаксиса языка и владение структурами данных. Возможно, при цивилизованном рынке труда это все работает. Но в наших условиях тотальной нехватки квалифицированных кадров, приходится оценивать скорее перспективную адекватность претендента той работе с которой он столкнется. Т.е. способность научиться, прорваться, разобраться, сделать.
По духу это похоже на «собеседованию» при наборе легионеров в древнем Риме. Будущего вояку сильно пугали и смотрели краснеет он или бледнеет. Если бледнеет, то в стрессовой ситуации у претендента кровь отливает от головы и он склонен к пассивной реакции. Например, упасть в обморок. Если же соискатель краснел, то кровь у него к голове приливает. Т.е. он склонен к активным действиям, бросаться в драку. Такой считался годным.
Ну и последнее. Почему я рассказал об этой задаче всем, а не продолжаю использовать её на собеседованиях? Просто, эту задачу уже «выучили» потенциальные соискатели и приходится использовать другие.
Собственно на этот эффект я обратил внимание именно в связи с реальной задачей обработки изображений. Ситуация была несколько запутанная и я не сразу понял почему у меня так просел fps после рефакторинга. А вообще таких чуднЫх моментов наверное много накопилось у каждого.

Пока лидирует версия, что «виноват» кэш процессора. Т.е. последовательный доступ в первом варианте работает в пределах хэша, который обновляется при переходе за определенную границу. При доступе по столбцам хэш вынужден постоянно обновляться и это занимает много времени. Давайте проверим эту версию в самом чистом виде. Заведем массив и сравним, что быстрее - обработать все элементы подряд или столько же раз обработать элементы массива со случайным номером? Вот эта программа - ideone.com/tMaR2S . Для 100000 элементов массива случайный доступ обычно оказывается заметно быстрее. Что же это означает?
Тут мне совершенно справедливо указали (Big_Lebowski), что перестановка циклов меняет результаты в пользу последовательного варианта. Пришлось для чистоты эксперимента поставить цикл для разогрева. Заодно сделал несколько повторов, чтобы вывести среднее время работы как советовал leventov. Получилось так ideone.com/yN1H4g . Т.е. случайный доступ к элементам большого массива на ~10% медленнее чем последовательный. Возможно и в правду какую-то роль может сыграть кэш. Однако, в исходной ситуации производительность проседала в разы. Значит есть еще что-то.

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

Теги: Добавить метки

Что такое массив?

Массив в Java - это набор элементов одного типа, обратиться к которым можно по индексу.

Элементы массивов в Java расположены друг за другом в памяти компьютера. Ниже разбирается пример массива в Java.

Объявление массива в Java

Объявим массив, для хранения элементов типа int:

Здесь объявлена переменная arr, которая является массивом. Чтоб использовать эту переменную нужно её определить.

Определение массива в Java

Для определения массива в Java следует указать его длину, т.е. количество элементов, которые могут в нём храниться:

В нашем массиве бедет храниться 5 элементов.

Массив - это набор элементов. К каждому элементу массива можно обратиться по его номеру. Номер принято называть индексом. Нумерация элементов массива в Java идёт с нуля.

Как загрузить элементы в массив?

Присвоим значение первому элементу массива, а первый элемент имеет индекс ноль:

Присвоим значение второму элементу массива, а второй элемент имеет индекс один:

for(int inn = 0; inn < 5; inn++)
{
arr = inn;
}

Можно при объявлении массива сразу загрузить в него значения:

int arr = {0, 1, 2, 3, 4};

количество элементов здесь равно 5-ти, т.е. нет необходимости указать число элементов, оно будет определено автоматически.

Как получить элементы из массива?

К каждому элементу массива можно обратиться по его номеру. Чтоб получить элемент массива, надо указать имя массива и индекс элемента:

это первый элемент массива, ведь у первого элемета индекс ноль.

Присвоим значение третьего элемента массива переменной int a:

Выведем в цикле все элементы массива (переберем массив):

For(int inn = 0; inn < 5; inn++) { System.out.println("arr[" + inn + "] = " + arr); }

Упрощенный вариант цикла для вывода массива таков:

For(int inn: arr) { System.out.println("arr[" + inn + "] = " + arr); }

Как удалить массив в Java?

Удалить массив в Java можно так:

Как получить длину массива в Java?

Длину массива в Java получаем так:

int arrLength = arr.length;

Как получить первый элемент массива в Java?

int firstElem = arr;

Как получить полследний элемент массива в Java?

int lastElem = arr;

Как в Java задать массив переменной длины?

Как в Java задать массив переменной длины? Никак. Когда вы определяете массив, тогда и задаёте его длину, изменить её в дальнейшем нельзя. В таких случаях используют коллекции, например: Vector, ArrayList и др.

Итак, перемнной длина массива быть не может. Но можно использовать переменную при определении массива. Если так:

int cd;
int ab = new int;//Error.

то получим ошибку, длина массива не может быть переменной.

Надо задать значение cd:

int cd = 10;
int ab = new int;

Теперь нормально. Если после определения массива изменить переменную cd, то это не повлияет на массив, т.е. его длина не изменится. Пример:

Int cd = 10; int ab = new int; cd = 12;// Это можно arrLength = ab.length; System.out.println("ab array length = " + arrLength); //Выводит: ab array length = 10 ab=4;// А вот здесь ошибка

Получим ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11

Максимальный индекс нашего массива равен 9-ти. Изменение значения переменной cd не влияет на массив, ведь он уже определен и его длина есть константа.

Переменные можно использовать для обращения к элементам массива:

Int var = 1;
int elem = arr;
var = 2;
elem = arr;

Массив символов в Java

Пример массива символов в Java и его вывода:

Char charArr = {"S", "B", "P"}; for(int inn = 0; inn < charArr.length; inn++) { System.out.println("charArr[" + inn + "] = " + charArr); }

Как заполнить массив в Java?

Заполнить массив можно с помощью статического метода fill.

19 ответов

Вы можете использовать объявление массива или литерал массива (но только когда вы сразу объявляете и влияете на переменную, литералы массива не могут использоваться для переназначения массива).

Для примитивных типов:

Int myIntArray = new int; int myIntArray = {1,2,3}; int myIntArray = new int{1,2,3};

Для классов, например String , это то же самое:

String myStringArray = new String; String myStringArray = {"a","b","c"}; String myStringArray = new String{"a","b","c"};

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

String myStringArray; myStringArray = new String{"a","b","c"};

Существует два типа массива.

Один размерный массив

Синтаксис значений по умолчанию:

Int num = new int;

Или (менее предпочтительный)

Int num = new int;

Синтаксис с указанными значениями (инициализация переменной/поля):

Int num = {1,2,3,4,5};

Или (менее предпочтительный)

Int num = {1, 2, 3, 4, 5};

Примечание. Для удобства int num предпочтительнее, потому что в нем четко сказано, что вы говорите здесь о массиве. Иначе никакой разницы. Совсем нет.

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

Декларация

int num = new int;

Int num = new int;

Int num = new int;

Инициализация

num=1; num=2; num=1; num=2; num=1; num=2; num=1; num=2; num=1; num=2;

Int num={ {1,2}, {1,2}, {1,2}, {1,2}, {1,2} };

Ragged Array (или непрямоугольный массив)

int num = new int; num = new int; num = new int; num = new int; num = new int;

Итак, здесь мы явно определяем столбцы.
Другой способ:

Int num={ {1}, {1,2}, {1,2,3,4,5}, {1,2}, {1,2,3} };

Для доступа:

for (int i=0; i<(num.length); i++) { for (int j=0;jВ качестве альтернативы:

For (int a: num) { for (int i: a) { System.out.println(i); } }

Type variableName = new Type; Type variableName = {comma-delimited values}; Type variableName = new Type; Type variableName = {comma-delimited values};

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

Ниже показано объявление массива, но массив не инициализирован:

Int myIntArray = new int;

Ниже показано объявление, а также инициализация массива:

Int myIntArray = {1,2,3};

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

Int myIntArray = new int{1,2,3};

Но этот третий показывает свойство анонимного создания массива-объекта, которое указывается ссылочной переменной "myIntArray", поэтому, если мы пишем только "new int {1,2,3};" то это может быть анонимный массив-объект.

Если мы просто напишем:

Int myIntArray;

это не объявление массива, но следующий оператор делает следующее выражение завершенным:

MyIntArray=new int;

Я считаю полезным, если вы понимаете каждую часть:

Type name = new Type;

Type - это тип переменной, называемой именем ("имя" называется идентификатором). Литеральный "Тип" - это базовый тип, а скобки означают, что это тип массива этой базы. Типы массивов в свою очередь являются собственными, что позволяет создавать многомерные массивы типа Type (тип массива Type ). Ключевое слово new говорит о распределении памяти для нового массива. Число между скобкой говорит о том, насколько большой будет новый массив и сколько памяти будет выделено. Например, если Java знает, что базовый тип Type занимает 32 байта, и вам нужен массив размером 5, ему необходимо внутренне выделить 32 * 5 = 160 байт.

Вы также можете создавать массивы с уже имеющимися значениями, такими как

Int name = {1, 2, 3, 4, 5};

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

Кроме того, если вы хотите что-то более динамичное, есть интерфейс List. Это не будет работать, но более гибко:

List listOfString = new ArrayList(); listOfString.add("foo"); listOfString.add("bar"); String value = listOfString.get(0); assertEquals(value, "foo");

Существует два основных способа создания массива:

Этот, для пустого массива:

Int array = new int[n]; // "n" being the number of spaces to allocate in the array

И этот, для инициализированного массива:

Int array = {1,2,3,4 ...};

Вы также можете создавать многомерные массивы, например:

Int array2d = new int[x][y]; // "x" and "y" specify the dimensions int array2d = { {1,2,3 ...}, {4,5,6 ...} ...};

Возьмите примитивный тип int , например. Существует несколько способов объявления и массив int:

Int i = new int; int i = new int {value1, value2, value3, etc}; int i = {value1, value2, value3, etc};

где во всех этих случаях вы можете использовать int i вместо int i .

С отражением вы можете использовать (Type) Array.newInstance(Type.class, capacity);

Обратите внимание, что в параметрах метода... отображается variable arguments . По сути, любое количество параметров в порядке. Это проще объяснить с помощью кода:

Public static void varargs(int fixed1, String fixed2, int... varargs) {...} ... varargs(0, "", 100); // fixed1 = 0, fixed2 = "", varargs = {100} varargs(0, "", 100, 200); // fixed1 = 0, fixed2 = "", varargs = {100, 200};

Внутри метода varargs рассматривается как нормальный int . Type... может использоваться только в параметрах метода, поэтому int... i = new int {} не будет компилироваться.

Обратите внимание, что при передаче int методу (или любому другому Type) вы не можете использовать третий способ. В заявлении int i = *{a, b, c, d, etc}* компилятор предполагает, что {...} означает int . Но это потому, что вы объявляете переменную. При передаче массива методу декларация должна быть либо new Type , либо new Type {...} .

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

Многомерные массивы гораздо сложнее справиться. По существу, 2D-массив представляет собой массив массивов. int означает массив int s. Ключ состоит в том, что если int объявлен как int[x][y] , максимальный индекс равен i . По существу, прямоугольник int равен:

Объявление массива ссылок на объекты:

Class Animal {} class Horse extends Animal { public static void main(String args) { /* * Array of Animal can hold Animal and Horse (all subtypes of Animal allowed) */ Animal a1 = new Animal; a1 = new Animal(); a1 = new Horse(); /* * Array of Animal can hold Animal and Horse and all subtype of Horse */ Animal a2 = new Horse; a2 = new Animal(); a2 = new Horse(); /* * Array of Horse can hold only Horse and its subtype (if any) and not allowed supertype of Horse nor other subtype of Animal. */ Horse h1 = new Horse; h1 = new Animal(); // Not allowed h1 = new Horse(); /* * This can not be declared. */ Horse h2 = new Animal; // Not allowed } }

Массив - это последовательный список элементов

Int item = value; int one_dimensional_array = { value, value, value, .., value }; int two_dimensional_array = { { value, value, value, .. value }, { value, value, value, .. value }, .. .. .. .. { value, value, value, .. value } };

Если это объект, то это же понятие

Object item = new Object(); Object one_dimensional_array = { new Object(), new Object(), .. new Object() }; Object two_dimensional_array = { { new Object(), new Object(), .. new Object() }, { new Object(), new Object(), .. new Object() }, .. .. .. { new Object(), new Object(), .. new Object() } };

В случае объектов вам нужно либо назначить его null для инициализации с помощью new Type(..) , классы, такие как String и Integer , являются особыми случаями, которые будут обрабатываться как следующие

String a = { "hello", "world" }; // is equivalent to String a = { new String({"h","e","l","l","o"}), new String({"w","o","r","l","d"}) }; Integer b = { 1234, 5678 }; // is equivalent to Integer b = { new Integer(1234), new Integer(5678) };

В общем случае вы можете создавать массивы, которые M мерные

Int .. array = // ^ M times brackets {{..{ // ^ M times { bracket // this is array.. // ^ M times }}..} // ^ M times } bracket ;

Стоит отметить, что создание размерного массива M является дорогостоящим с точки зрения Space. Поскольку при создании массива M с N во всех измерениях общий размер массива больше, чем N^M , так как каждый массив имеет ссылку, а в M-размерности есть (M -1) -мерный массив ссылок. Общий размер выглядит следующим образом


Учеба на "Разработчика игр" + трудоустройство

Java массивы

Массив - это структура данных, в которой хранятся величины одинакового типа. Доступ к отдельному элементу массива осуществляется с помощью целого индекса. Например, если а - массив целых чисел, то значение выражения а [ i ] равно i-му целому числу в массиве.

Массив объявляется следующим образом: сначала указывается тип массива, т.е тип элементов, содержащихся в массиве, за которым ставится пара пустых квадратных скобок, а затем - имя переменной. Например, вот как объявляется массив, состоящий из целых чисел:
int a;

Однако этот оператор лишь объявляет переменную а, не инициализируя ее настоящим массивом. Чтобы создать массив, нужно применить оператор new.

Этот оператор создает массив, состоящий из 100 целых чисел. Элементы этого массива нумеруются от 0 до 99 (а не от 1 до 100). После создания массив можно заполнять, например, с помощью цикла.

int а = new int;
for (int i = 0; i < 100; i++)
a[i] = i; // Заполняет массив числами от 0 до 99.

Если вы попытаетесь обратиться к элементу а (или любому другому элементу, индекс которого выходит за пределы диапазона от 0 до 99), создав массив, состоящий из 100 элементов, программа прекратит работу, поскольку возникнет исключительная ситуация, связанная с выходом индекса массива за пределы допустимого диапазона.
Чтобы подсчитать количество элементов в массиве, используйте метод имяМасси-
ва.length.

Например,

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

После создания массива изменить его размер невозможно (хотя можно, конечно, изменять отдельные его элементы). Если в ходе выполнения программы необходимо часто изменять размер массива, лучше использовать другую структуру данных, называемую списком массивов (array list).

Массив можно объявить двумя способами:

int a;
или
int a;

Большинство программистов на языке Java предпочитают первый стиль, поскольку в нем четче отделяется тип массива int (целочисленный массив) от имени переменной.

Инициализаторы массивов и безымянные массивы

В языке Java есть средство для одновременного создания массива и его инициализации. Вот пример такой синтаксической конструкции:

int smallPrimes = { 2, 3, 5, 7, 11, 13};

Отметим, что в этом случае не нужно применять оператор new. Кроме того, можно даже инициализировать безымянный массив:

new int { 16, 19, 23 , 29 , 31, 37}

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

smallPrimes = new int{ 17, 19, 23, 29, 31, 37 };
представляет собой укороченную запись выражения
int anonymous = { 17, 19, 23, 29, 31, 37 };
smailPrimes = anonymous;

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

new типЭлементов

Заметим, что такой массив не эквивалентен объекту null.

Копирование массивов

Один массив можно скопировать в другой, но при этом обе переменные будут ссылаться на один и тот же массив.

int luckyNumbers = smailPrimes;
luckyNuimbers = 12; // Теперь элемент smailPrimesтакже равен 12.

Результат показан на рис. 3.14. Если необходимо скопировать все элементы одного массива в другой, следует использовать метод arraycopy из класса System. Его вызов выглядит следующим образом:

System.arraycopy(from, fromlndex, to, tolndex, count);

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

Рис. 3.14. Копирование массива

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

int smailPrimes = {2, 3, 5, 7, 11, 13};
int luckyNumbers = {1001, 1002, 1003, 1004, 1005, 1006, 1007};
System.аггаусору(smailPrimes, 2, luckyNumbers, 3, 4);
for (int i = 0; i < luckyNumbers.length; i++)
System.println(i +.": " + luckyNumbersfi]);

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

0: 1001
1: 1002
2: 1003
3: 5
4: 7
5: 11
6: 13

Рис. 3.15. Копирование элементов массива

Массив в языке Java значительно отличается от массива в языке C++. Однако он практически совпадает с указателем на динамический массив. Это значит, что оператор

int a = new int; //Java
эквивалентен оператору
i n t * = new i n t [ 1 0 0 ] ; // C++,
а не
int a; // C++

В языке Java оператор no умолчанию проверяет диапазон изменения индексов. Кроме того, в языке Java нет арифметики указателей - нельзя увеличить указатель а, чтобы обратиться к следующему элементу массива.

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

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

Матрицы и двумерные массивы в Java

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

Общий вид матрицы размером m x n (m — количество строк, n — количество столбцов), выглядит следующим образом:

Каждый элемент матрицы имеет свой индекс, где первая цифра обозначает номер строки на которой находится элемент, а вторая — номер столбца.

Рассмотрим примеры конкретных матриц и создадим их с помощью Java.

Матрица A имеет размерность 2 на 3 (2 строки, 3 столбца). Создадим двухмерный массив этой размерности:

Int matrixA; matrixA = new int ;

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

Для доступа к элементам двумерного массива необходимо использовать 2 индекса: первый для строки, второй – для столбца. Как и в случае с одномерными массивами, индексы также начинаются с нуля. Поэтому нумерация строк и столбцов в таблице начинается с 0.

MatrixA = 1; matrixA = -2; matrixA = 3; matrixA = 4; matrixA = 1; matrixA = 7;

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

For (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); }

То есть, сначала выводим все элементы первой строки, отделяя их символом табуляции "\t", переносим строку и выводим все элементы второй строки.

Полностью код для матрицы А выглядит следующим образом:

Public class Matrix { public static void main(String args) { int matrixA; matrixA = new int; matrixA = 1; matrixA = -2; matrixA = 3; matrixA = 4; matrixA = 1; matrixA = 7; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); } } }

Для матрицы B воспользуемся упрощенным способом инициализации — в момент объявления. По аналогии с одномерными массивами.

Int matrixB = { {-9,1,0}, {4,1,1}, {-2,2,-1} };

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

Полностью код для матрицы B :

Public class Matrix { public static void main(String args) { int matrixB = { {-9,1,0}, {4,1,1}, {-2,2,-1} }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixB[i][j] + "\t"); } System.out.println(); } } }

Рассмотрим инициализацию в цикле для двумерного массива на примере таблицы умножения.

Public class Mult { public static void main(String args) { // создаем двумерный массив 10 на 10 int multiplyTab = new int; // цикл по первой размерности for (int i = 0; i < 10; i++) { // цикл по второй размерности for (int j = 0; j < 10; j++) { //инициализация элементов массива multiplyTab[i][j] = (i+1)*(j+1); //вывод элементов массива System.out.print(multiplyTab[i][j] + "\t"); } System.out.println(); } } }

Здесь инициализация элементов значениями таблицы умножения совмещена с их выводом на консоль в одном цикле.

Многомерные и несимметричные массивы.

Создаются многомерные массивы в Java аналогичным способом. Количество квадратных скобок указывает на размерность.
Примеры создания массивов фиксированной длины:

Int a = new int;// двумерный массив int b = new int;// трехмерный массив int c = new int;// четырехмерный массив // и т.д.

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

Int a1 = new int;// двумерный массив с 5 строками

В данном случае, пока неизвестно сколько будет элементов в каждой строке, это можно определить позже, причем, массив может содержать в каждой строке разное количество элементов, то есть быть несимметричным . Определим количество элементов в каждой строке для массива a1

A1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ;

В результате, при выводе на экран,

For(int i = 0; i

массив будет иметь такой вид:

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0

При создании массива его элементы автоматически инициализируются нулями, поэтому в это примере на экран выведены нули.

Упражнения на тему многомерные массивы в Java:

  1. Создайте массив размерностью 5 на 6 и заполните его случайными числами (в диапазоне от 0 до 99). Выведите на консоль третью строку
  2. Даны матрицы С и D размерностью 3 на 3 и заполненные случайными числами в диапазоне от 0 до 99. Выполните по отдельности сначала сложение, потом умножения матриц друг на друга. Выведете исходные матрицы и результат вычислений на консоль.
  3. Просуммируйте все элементы двумерного массива.
  4. Дан двумерный массив, содержащий отрицательные и положительные числа. Выведете на экран номера тех ячеек массива, которые содержат отрицательные числа.
  5. Отсортируйте элементы в строках двумерного массива по возрастанию