Intereting Posts
Прочитать весь стандартный ввод в массив байтов Java Связывание JSF inputText с полем bean-компонента, не отображающим его значение Выделение узла элементу, предоставляющему ClassCastException Есть ли способ сказать, что «метод возвращает это» в Java? Инъекция CDI невозможна в экземпляре Subresource JAX-RS, созданном ResourceContext initResource Можете ли вы наследовать версию родительского ПОМ в Maven? Почему я могу назначить int переменной char без явного приведения? Java Web Start NumberFormatException при запуске приложения Jar сравнение двух коллекций для сравнения двух текстовых файлов для дополнений, удалений, модификаций Отсутствует возможность исправить обработку данных JDBC в Java 8? Преобразовать .class в .java Список запущенных JVM на локальном хосте Есть ли способ нарисовать UML в Visio для Java? Как удалить JLabel, когда я нажимаю на определенную клавишу на клавиатуре? Расширение простого ANTLR-грамма для поддержки входных переменных

Как преобразовать массив 1d в массив 2d?

Скажем, у меня есть 1d массив с 30 элементами:

array1d[0] = 1 array1d[1] = 2 array1d[2] = 3 . . . array1[29] = 30 

Как преобразовать массив 1d в массив 2d?
Скажите 10×3?

 array2d[0][0] = 1 array2d[0][1] =2 array2d[0][2] =3 . . . array2d[9][0] = 28 array2d[9][1] =29 array2d[9][2] =30 

Должен ли я использовать цикл for?
Но я не могу это решить.

Без написания кода для вас …

  • Подумайте о том, насколько большой ваш 2d-массив должен быть.
  • Признайте, что вам нужно будет перебрать содержимое исходного массива, чтобы получить каждое значение в вашем целевом массиве.

Так что это будет выглядеть как …

  • Создайте 2d массив соответствующего размера.
  • Используйте цикл for для цикла над вашим массивом 1d.
  • Внутри этого цикла вам нужно выяснить, где каждое значение в массиве 1d должно идти в массиве 2d. Попробуйте использовать функцию mod против вашей переменной счетчика, чтобы «обернуть» индексы массива 2d.

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

 int array2d[][] = new int[10][3]; for(int i=0; i<10;i++) for(int j=0;j<3;j++) array2d[i][j] = array1d[(j*10) + i]; 
 public class Test{ public static void main(String[] argv) { int x,y; for(int num =0; num<81;num++) { if((num % 9)>0) { x = num/9; y = num%9; }else { x = num/9; y = 0; } System.out.println("num ["+num+"]---["+x+","+y+"]"); } } } /* Replace 9 by the size of single row of your 2D array */ 

Здесь общая функция для преобразования из массива 1D -> 2D:

 public int[][] monoToBidi( final int[] array, final int rows, final int cols ) { if (array.length != (rows*cols)) throw new IllegalArgumentException("Invalid array length"); int[][] bidi = new int[rows][cols]; for ( int i = 0; i < rows; i++ ) System.arraycopy(array, (i*cols), bidi[i], 0, cols); return bidi; } 

Если вы хотите сделать обратное (2D -> 1D), здесь функция:

 public int[] bidiToMono( final int[][] array ) { int rows = array.length, cols = array[0].length; int[] mono = new int[(rows*cols)]; for ( int i = 0; i < rows; i++ ) System.arraycopy(array[i], 0, mono, (i*cols), cols); return mono; } 
 int[] oneDArray = new int[arr.length*arr.length]; //Flatten 2D array to 1D array... int s = 0; for(int i = 0; i < arr.length; i ++) for(int j = 0; j < arr.length; j ++){ oneDArray[s] = arr[i][j]; s++; } 

Вы часто найдете ту же проблему: как манипулировать 2D-массивом как массив 1D. Я написал общий class Grid, который позволяет обращаться к объектам по индексу или по (x, y) .

См. Следующий class и понимайте его идею. 🙂

Вы можете использовать следующий class для обработки данных как 2D-массив или 1D-массив. Вот код, который я написал и использовал.

 /** * Grid represents a 2 dimensional grid. * * @param  the type of elements in this grid */ import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class Grid { private int size ; private int width ; private int height ; private List elements; public int getCapacity() { return getWidth() * getHeight(); } /** * @return number of elements in grid. Null is also an element. */ public int getSize() { return getElements().size(); } /** * @param sideSize size of the grid side */ public Grid(int sideSize) { this(sideSize,sideSize); } /** * @param width of the grid * @param height of the grid */ public Grid(int width, int height) { this.width = width ; this.height = height; this.elements = new ArrayList( Collections.nCopies(width*height, (E)null)); } public int getHeight() { return height; } public int getWidth() { return width; } /** * @return all elements of the grid */ public List getElements() { return elements; } /** * @return iterator for a grid */ public Iterator iterator() { return getElements().iterator(); } /** * Returns the element at position (x,y). * * @return the element at position (x,y) */ public E get(int x, int y) { return getElements().get( idx(x,y)); } /** * Returns the element at index idx. * * @return the element at given index */ public E get(int idx) { return getElements().get(idx); } /** * Puts an element to the position idx * * @param element to be added * * @param x position x to add element to * * @param y position y to add element to */ public void put(int x, int y, E element) { put(idx(x,y), element); } /** * Puts an element to the position idx * * @param element to be added * * @param idx to add element at */ public void put(int idx, E element) { getElements().add(idx, element); } /** * Returns the x coordinate from the index. * * @return x coordinate of the index */ public int x(int idx) { return idx % getHeight(); } /** * Returns the y coordinate from the index. * * @return y coordinate of the index */ public int y(int idx) { return (idx - idx % getHeight()) / getHeight(); } /** * Returns index of element at (x,y). * * @return index of the coordinates */ public int idx(int x, int y) { return y*getHeight() + x; } } 

Вот как использовать class (см. Тестовый пример):

 public class TestGrid { public static final int SIZE = 10; public static final Integer el1 = new Integer(2); public static final Integer el2 = new Integer(3); public static final Integer el3 = new Integer(3); public static void main(String[] args) { Grid grid = new Grid<>(SIZE); assert grid.getCapacity() == SIZE*SIZE ; assert grid.idx(0,0) == 0 ; assert grid.idx(1,0) == 1 ; assert grid.idx(0,1) == 10; assert grid.idx(6,1) == 16; assert grid.idx(9,9) == 99; grid.put(1, el1); assert grid.get(1) == el1 : grid.get(1); grid.put(0, 1, el2); assert grid.get(0,1) != el1 && el1 != el2 && grid.get(0,1) == el2; grid.put(15, el3); assert grid.get(5,1) == el3; } } 

Вы не можете «преобразовать» 1D-массив в 2D-массив, но массив может быть многомерным, когда вы его объявляете.

 int myArray2d[][] = new int[10][3]