Многомерные массивы в Java. Как преобразовать массив в ассоциативный? | OTUS

Многомерные массивы в Java. Как преобразовать массив в ассоциативный?

Массивы в Java используются довольно часто. В этой статье мы поговорим про многомерные (двумерные, трёхмерные) и ассоциативные массивы. И, разумеется, приведём соответствующие примеры.

В первую очередь, рассмотрим пример объявления многомерного массива:

int[][] a = new int[3][4];

Итак, перед нами 2-мерный Java-массив, который может включать в себя до 12 элементов типа int:

java_2d_array_1-20219-347ae5.jpg

Вы должны помнить, что индексирование массива в Java начинается с нуля, поэтому его первые элементы имеют индекс не 1, а 0.

Таким же образом объявляется и 3-мерный (3D) массив:

String[][][] personalInfo = new String[3][4][2];

Здесь перед нами 3-мерный массив, который может содержать до 24 (3 x 4 x 2) элементов типа String.

Составляющие многомерного массива в Java тоже являются массивами. При этом, в отличие от C/C++, ряды массивов в Java могут быть разной длины.

Инициализируем двухмерный массив в Java

Давайте посмотрим, как инициализируется многомерный (в нашем случае — двумерный) Java-массив:

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

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

2d_array_variable_length_1-20219-98f222.jpg

Докажем это с помощью кода:

class Two2DArray {
   public static void main(String[] args) {

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

      System.out.println("Длина ряда № 1: " + a[0].length);
      System.out.println("Длина ряда № 2: " + a[1].length);
      System.out.println("Длина ряда № 3: " + a[2].length);
   }
}

Результат будет следующим

Длина ряда 1: 3
Длина ряда 2: 4
Длина ряда 3: 1

Т. к. многомерный массив включает в себя отдельные массивы (a[0], a[1] и a[2]), мы можем задействовать метод length, чтобы определить длину каждого ряда 2-мерного Java-массива.

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

class TwoDArray {
   public static void main(String[] args) {

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

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

Когда надо пройтись по элементам массива, использование цикла for…each — одно из лучших решений. Пример сортировки двухмерного Java-массива мы можем записать посредством цикла for…each таким образом:

class TwoDArray {
   public static void main(String[] args) {

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

     for (int[] innerArray: a) {
        for(int data: innerArray) {
           System.out.println(data);
        }
     }
   }
}

Запустив этот код, мы увидим итог заполнения двумерного Java-массива:

1
-2
3
-4
-5
6
9
7

Инициализируем 3-мерный массив в Java

На самом деле, трёхмерный массив инициализируется практически так же, как и двумерный:

// test — 3-мерный массив
int[][][] test = {
              {
               {1, -2, 3}, 
               {2, 3, 4}
              }, 
              { 
               {-4, -5, 6, 9}, 
               {1}, 
               {2, 3}
              } 
};

Трёхмерный Java-массив состоит из 2-мерных массивов. И, разумеется, длина рядов может быть различна.

Давайте напишем программу, выводящую элементы 3-мерного массива посредством циклов:

class ThreeDArray {
   public static void main(String[] args) {

     // test – 3-мерный массив
     int[][][] test = {
              {
               {1, -2, 3}, 
               {2, 3, 4}
              }, 
              { 
               {-4, -5, 6, 9}, 
               {1}, 
               {2, 3}
              } 
     };

     // цикл for..each проходит по всем элементам 3-мерного массива
     for (int[][] array2D: test) {
        for (int[] array1D: array2D) {
           for(int item: array1D) {
              System.out.println(item);
           }
        }
     }
  }
}

Итог будет следующим:

1
-2
3
2
3
4
-4
-5
6
9
1
2
3

Ассоциативные массивы в Java

У ассоциативного массива в качестве ключей применяются строки. Мы можем представить его структуру данных в виде совокупности пары «ключ-значение». В таком массиве, как ассоциативный, любое значение связано с конкретным ключом, а доступ к значению производится по имени ключа.

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

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

Посмотрим, как это работает:

    HashMap<String, Integer> fruits = new HashMap();
fruits.put("Число апельсинов", 5);
fruits.put("Число яблок", 10);
fruits.put("Число мандаринов", 7);
System.out.println(fruits.get("Число мандаринов"));

Мы можем создать ассоциативный массив и с более сложной структурой, поместив объекты HashMap друг в друга и получив тем самым «ассоциативные массивы в ассоциативном массиве». Посмотрим, как это выглядит на практике:

    HashMap<String, Integer> fruits = new HashMap();
fruits.put("Число апельсинов", 5);
fruits.put("Число яблок", 10);
fruits.put("Число мандаринов", 7);
HashMap<String, Integer> milkProducts = new HashMap();
milkProducts.put("Число пачек творога", 2);
milkProducts.put("Число пакетов молока", 3);
milkProducts.put("Число банок сметаны", 17);
HashMap<String, HashMap<String, Integer> > eat = new HashMap();
eat.put("Фрукты", fruits);
eat.put("Молочные продукты", milkProducts);
System.out.println(eat.get("Молочные продукты").get("Число пакетов молока"));

В результате мы решим проблему отсутствия ассоциативных массивов в Java.

При подготовке статьи использовались следующие материалы: — Java Multidimensional Arrays; — «Ассоциативные массивы в Java».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
2 комментария
1

Hey Andrey, You have the concept of multidimenional array very well. Thanks for sharing. https://www.flowerbrackets.com/multidimensional-array-in-java/

0

Здравствуйте.

Пытался выполнить лабораторную работу. Суть заключается в следующем: найти решение системы 3 линейных уравнений с 3 неизвестными используя метод Крамера (для понимания дордаю ссылку https://www.mathros.net.ua/rozvjazok-systemy-linijnyh-algebraichnyh-rivnjan-metodom-kramera.html).

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

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

Заранее спасибо.

Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто
Запланируй обучение с выгодой!
Получи скидку 10% на все курсы ноября и декабря до 16.11 →