Как преобразовать двумерный массив в одномерный?
Дан на вход программы двумерный массив. Значения из него нужно записать в одномерный массив, по массиву пройтись «змейкой» и вывести на экран. В моем коде выдает ошибку переполнения массива:
import java.util.Arrays; public class SnakeArray < public static void main(String[] args) < SnakeArray snakeArray = new SnakeArray(); snakeArray.toSnakeArray(new int[][], >); > private void toSnakeArray(int[][] largeArray) < String[] smallArray = new String[largeArray[0].length + largeArray[1].length]; for (int i = 0; i < smallArray.length; i++) < for (int j=0;j> System.out.println(Arrays.toString(smallArray)); > > Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 SnakeArray.toSnakeArray(SnakeArray.java:20) SnakeArray.main(SnakeArray.java:11)
Отслеживать
25.9k 7 7 золотых знаков 31 31 серебряный знак 48 48 бронзовых знаков
задан 4 мая 2020 в 9:47
91 10 10 бронзовых знаков
Приведите точный текст ошибки
4 мая 2020 в 9:51
Exception in thread «main» java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 SnakeArray.toSnakeArray(SnakeArray.java:20) SnakeArray.main(SnakeArray.java:11)
4 мая 2020 в 9:53
Под вопросом кнопка «править», используйте ее
4 мая 2020 в 9:55
вы идёте по длинне smallArray в цикле а не по largeArray
4 мая 2020 в 9:57
да, но на вход в качестве размерности я передаю размерность большого массива
4 мая 2020 в 9:58
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Старайтесь писать более универсальные методы. Что если массив состоит не из интов или матрица лохматая? Хотелось бы не переписывать код каждый раз. Кроме того, массивы, безусловно, имеют свои преимущества, однако в большинстве случаев использовать коллекции на много проще, особенно с учетом того, что ArrayList в себе по сути инкапсулирует этот самый массив, соответственно, получит массив в нужный момент не составит труда. И последнее. Зачастую проще использовать циклы без индексов либо стримы просто потому, что такой код читается проще и меньше шансов допустить ошибку.
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class SnakeArray < public static void main(String[] args) < SnakeArray snakeArray = new SnakeArray(); Listresult = snakeArray.toSnakeArray(new Integer[][], >); System.out.println(Arrays.toString(result.toArray())); > private List toSnakeArray(T[][] array) < final Listresult = new ArrayList<>(); for (T[] arrays : array) result.addAll(Arrays.asList(arrays)); return result; > >
Отслеживать
ответ дан 4 мая 2020 в 17:19
10.2k 2 2 золотых знака 11 11 серебряных знаков 26 26 бронзовых знаков
Спасибо за совет. Но здесь задание конкретное.
4 мая 2020 в 17:52
@Delembech вам абстрактного задания никто никогда и не поставит. задание всегда будет конкретное, а вывести из этого абстракции — и есть ваша задача. в противном случае на выходе процедурная реализация , жуткое дублирование кода дублирование кода и т.д. по списку
Многомерные массивы в Java. Как преобразовать массив в ассоциативный?
Массивы в Java используются довольно часто. В этой статье мы поговорим про многомерные (двумерные, трёхмерные) и ассоциативные массивы. И, разумеется, приведём соответствующие примеры.
В первую очередь, рассмотрим пример объявления многомерного массива:
int[][] a = new int[3][4];Итак, перед нами 2-мерный Java-массив, который может включать в себя до 12 элементов типа int:
Вы должны помнить, что индексирование массива в 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 = < , , , >;При этом каждый компонент массива будет тоже представлять собой массив, причём с разной длиной:
Докажем это с помощью кода:
class Two2DArray < public static void main(String[] args) < int[][] a = < , , , >; 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 = < , , , >; 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 = < , , , >; 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 = < < , >, < , , > >;Трёхмерный Java-массив состоит из 2-мерных массивов. И, разумеется, длина рядов может быть различна.
Давайте напишем программу, выводящую элементы 3-мерного массива посредством циклов:
class ThreeDArray < public static void main(String[] args) < // test – 3-мерный массив int[][][] test = < < , >, < , , > >; // цикл 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 fruits = new HashMap(); fruits.put("Число апельсинов", 5); fruits.put("Число яблок", 10); fruits.put("Число мандаринов", 7); System.out.println(fruits.get("Число мандаринов"));Мы можем создать ассоциативный массив и с более сложной структурой, поместив объекты HashMap друг в друга и получив тем самым «ассоциативные массивы в ассоциативном массиве». Посмотрим, как это выглядит на практике:
HashMap fruits = new HashMap(); fruits.put("Число апельсинов", 5); fruits.put("Число яблок", 10); fruits.put("Число мандаринов", 7); HashMap milkProducts = new HashMap(); milkProducts.put("Число пачек творога", 2); milkProducts.put("Число пакетов молока", 3); milkProducts.put("Число банок сметаны", 17); HashMapeat = new HashMap(); eat.put("Фрукты", fruits); eat.put("Молочные продукты", milkProducts); System.out.println(eat.get("Молочные продукты").get("Число пакетов молока")); В результате мы решим проблему отсутствия ассоциативных массивов в Java.
Преобразование двумерного массива в одномерный Java
Нужно преобразовать двумерный массив nxm (rows, colums) с рандомными числами в одномерный
Вот такой набросок, но количество столбцов ограничено из-за двумерного массива и не даёт преобразовать его в одномерный1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56package prac1; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Prac1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); List list = new ArrayList(); int i, j = 0, rows, columns, N, k; int[][] array = null; System.out.print("Введите кол-во строк :\n> "); rows = sc.nextInt(); System.out.print("Введите кол-во столбцов:\n> "); columns = sc.nextInt(); System.out.print("Введите максимум для генератора чисел:\n> "); N = sc.nextInt(); array = new int[rows][columns]; int[][] array2 = new int[rows][rows*columns]; java.util.Random random = new java.util.Random(); for (i = 0; i rows; ++i) for (j = 0; j columns; ++j) array[i][j] = random.nextInt(N) + 1; System.out.println("Матрица:"); for (i = 0; i rows; ++i, System.out.println()) for (j = 0; j columns; ++j) System.out.print(array[i][j] + " "); /*for (i = 0; i < rows; ++i, System.out.println()) for (j = 0; j < columns; ++j) list.add(array[i][j]); System.out.print("Список"); System.out.print(list+"\n");*/ int[][]copiedarray = Arrays.copyOf(array, array.length); for (j = 0; j columns*rows; ++j) System.out.print(copiedarray[i][j] + " "); } }===================
Введите кол-во строк :
> 5
Введите кол-во столбцов:
> 5
Введите максимум для генератора чисел:
> 5
Матрица:
2 4 1 2 5
5 3 5 5 4
3 4 3 1 5
3 4 3 2 4
2 2 1 2 5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 594731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:Преобразование двумерного массива в одномерный
Дан двумерный массив. Сформировать одномерный массив, каждый элемент которого равен сумме элементов.Преобразование двумерного массива в одномерный
Двумерный массив 4х4 вещественных чисел необходимо выложить в один ряд по элементам слева направо и.Преобразование двумерного массива в одномерный
Есть задача готовая, в итоге распечатывается двумерный массив Надо сделать так, чтобы печатались.Преобразование двумерного массива в одномерный
Помогите преобразовать данный двумерный массив в одномерный #include <iostream> #include.Am I evil? Yes, I am!
16120 / 9755 / 2731
Регистрация: 21.10.2017
Сообщений: 21,624
IJefri, вообще, возьми на вооружение - https://www.cyberforum.ru/java/thread2250765.html1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27Scanner sc = new Scanner(System.in); int rows, columns, index = 0; System.out.print("Введите кол-во строк :\n> "); rows = sc.nextInt(); System.out.print("Введите кол-во столбцов:\n> "); columns = sc.nextInt(); int[][] array = new int[rows][columns]; System.out.print("Введите максимум для генератора чисел:\n> "); int N = sc.nextInt(); int[] array2 = new int[rows * columns]; System.out.println("Матрица:"); for (int i = 0; i rows; ++i) { for (int j = 0; j columns; ++j) { array[i][j] = ThreadLocalRandom.current().nextInt(N + 1); System.out.print(array[i][j] + " "); array2[index++] = array[i][j]; } System.out.println(); } System.out.println("\nArray2: " + Arrays.toString(array2));2495 / 1944 / 486
Регистрация: 17.02.2014
Сообщений: 9,239
а из не квадратного 2-х мерного массива, не желаете?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48import java.util.Arrays; import java.util.concurrent.ThreadLocalRandom; public class Helper { // генерит не кводратный 2-х мекрный массив, случайной длинны строки (от 1 до 6), заполненной случайными числам // параметр задает количество строк private static int[][] getNonSquarMatrix(int row) { int[][] ret = new int[row][]; for (int i = 0; i row; i++) { int col = ThreadLocalRandom.current().nextInt(1, 6); ret[i] = new int[col]; for (int j = 0; j col; j++) { ret[i][j] = ThreadLocalRandom.current().nextInt(1, 10); } } return ret; } // из названия понятно, что делает метод private static void print2DimArray(int[][] arr) { for (int i = 0; i arr.length; i++) { for (int j = 0; j arr[i].length; j++) { System.out.print(j + 1 arr[i].length ? "" + arr[i][j] + ", " : "" + arr[i][j] + '\n'); } } System.out.println("______________"); } // из не квадрат. 2-х мерного массива генерит одномерный private static int[] getOneDimArrFromTwoDimArray(int [][] matrix) { int countElem = 0; for (int [] tmpArr : matrix) countElem += tmpArr.length; int [] ret = new int[countElem]; int indRet = 0; for (int [] tmpArr : matrix) for (int elemTmpArr : tmpArr) ret[indRet++] = elemTmpArr; return ret; } public static void main(String[] args) { int [][] twoNonSquDimArr = getNonSquarMatrix(4); print2DimArray(twoNonSquDimArr); int [] oneDimArrFromTwo = getOneDimArrFromTwoDimArray(twoNonSquDimArr); System.out.println(Arrays.toString(oneDimArrFromTwo)); } }1 2 3 4 5 65, 6, 6, 5, 8 3, 6, 6, 1 4, 1 2, 6, 2, 6 ______________ [5, 6, 6, 5, 8, 3, 6, 6, 1, 4, 1, 2, 6, 2, 6]87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесьПреобразование из двумерного массива в одномерный
Всем доброго. У меня есть "таблица" ячеек. При клике на ячейку я могу получить ее координаты в.Преобразование двумерного массива в одномерный массив
Ввести массив а(n,m). Сформировать одномерный массив b(n), каждый элемент которого равен: b(i)= П.Преобразование двумерного массива в одномерный, выстроив элементы в последовательность
Имеется ОДНОМЕРНЫЙ массив вида 1 2 3 4 5 7 1 4 8 9 6 8 3 6 9 5 3 2 Необходимо сделать из него .Преобразование двумерного массива
Помогите нужно написать функцию которая преобразовывает матрицу в строку по схеме например 1 2.Как из двумерного массива сделать одномерный java
Крайне рекомендую хотя бы переписать код(Не ctrl+C -> ctrl+V, а ручками), где создается шахматное поле, до прочтения статьи не было совсем ясно, как класть разные буквы и цифры в нужные ячейки массива. Спасибо за открытие этого метода:
Character.toString(letters.charAt(a))
Про перемножение матриц и задачи с многомерными массивами, пока не понял, но в закладки добавил Уже выработалось понимание, "Если в этот раз непонятно, то просто прочти до конца, а потом посмотри на это под другим углом" Когда-то я не понимал самих массивов
Владислав Уровень 16
26 февраля 2023перемножение матриц бошку вынесло, когда попытался представить написанный код)) короче если мне попадется такая задача, я сначало залезу в википедию, чтобы лучше понять) И это при условии, что я сдавал линейную алгебру в универе, прошло с тех пор 15 лет - я забыл 90%!
18 февраля 2023
Пришлось вспоминать как работают матрицы. А ведь я и подумать не мог, что после экзамена ещё хоть раз в жизни их увижу. Кстати, спасибо за пример с парковкой
Kergshi Уровень 13
9 февраля 2023Если у кого возникнет вопрос в примере вывода шахматной доски с с нумерацией ячеек,да! Вы правильно подумали,да,можно выбросить к черту повтор 2-х циклов ,а выводы сразу первых двух писать и будет работать точно также. Конечно,может я еще глуп и эта абра-кадабра с повторением одного и того же имеет смысл,но так как объяснения этому нет,то я "лишнее" выкинул и всё так же в итоге осталось по работоспособности.
Kergshi Уровень 13
9 февраля 2023Просвятите,пожалуйста,почему второй пример с доской,если скопировать, не работает в идее,выдаёт 15 ошибок. Циклы for вообще за циклы не воспринимает.
Kergshi Уровень 13
25 января 2023Да как разобраться во всей это куче ссылок. Идешь просто по курсу и тут на тебе,100500 ссылок почить то,почитать это. А там еще штук пять. Тут просто массивы,там "кое-что о массивах","массивы в Java". С ума сойти можно
Kirill Уровень 20
25 декабря 2022Как раз ищу ответ на это высказывание: "Если мы имеем дело с прямоугольными двумерными массивами (то есть такими, у которых все строки одинаковой длины), то можно применить операцию twoDimArray[0].length или вместо нулевого элемента (по сути — нулевой строки) — любой другой существующий. Мы можем так поступить, потому что в Java двумерный массив — это массив массивов, и нулевой элемент twoDimArray[0] — это массив длины 4. Можете проверить это самостоятельно." Что они имеют ввиду? Не вижу связи. Почему 0, а не [I]? Подскажите!
Олег Уровень 100 Expert
12 декабря 2022
Здравствуйте. Похоже в строке a[1][0]*b[0][0] + a[1][1]*b[0][1] + … + a[0][m-1]*b[m-1][0] ошибка.
Denis Odesskiy Уровень 29
11 декабря 2022Здравствуйте! Не могу понять зачем в листинге с примером про шахматную доску перед выводом результата в консоль повторен этот цикл:
for (int i = 0; i < chessBoard.length; i++) < for (int j = 0; j < chessBoard[0].length; j++)
С ним у меня пример не работает, а без него работает, это опечатка? Или в чем моя ошибка? Вот мой листинг кода без этого цикла:
public class CheessBoard < public static String cheessBoardCoord(int a, int b) < String letters = "abcdefgh"; String numbers = "87654321"; if ((a >7) || (b > 7)) return null; //если номер за пределами доски, возвращаем значение по умолчанию - null else return (Character.toString(letters.charAt(a)) + numbers.charAt(b)); /*charAt - метод, с помощью которого мы извлекаем из строки элемент под переданным номером, здесь - под номерами a и b. Character.toString - метод, который переводит полученный символ в строку*/ > public static void main(String[] args) < //задаём шахматную доску двумерным массивом String[][] cheessBoard = new String[8][8]; for (int i = 0; i < cheessBoard.length; i++) < for (int j = 0; j < cheessBoard[0].length; j++) < if ((i + j) % 2 == 0) cheessBoard[i][j] = "W" + cheessBoardCoord(j, i); else cheessBoard[i][j] = "B" + cheessBoardCoord(j, i); System.out.print(" " + cheessBoard[i][j] + " "); >System.out.println(); > > >
В примере с умножением матриц ошибка, - не объявлен тип переменной k:
for (k=0; k