How to convert 1d array to 2d array?

Let's say I have a 1d array with 30 elements:

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

How to convert a 1d array to a 2d array?
Say 10x3?

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

Should I use a for loop? But I canโ€™t solve it.

+7
source share
7 answers

Without writing code for you ...

  • Think about how big your 2nd array should be.
  • Recognize that you will need to iterate over the contents of your source array to get each value in the target array.

So it will look like ...

  • Create a 2d array of the appropriate size.
  • Use a for loop to loop over your 1d array.
  • Inside the for loop, you need to figure out where each value in the 1d array should go in the 2d array. Try using the mod function against your counter variable to wrap the indices of a 2d array.

I'm intentionally vague, seeing that this is homework. Try posting the code so we can see where you are stuck.

+14
source
 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]; 
+14
source
 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 */ 
+3
source

Here is a general function to convert from an 1D โ†’ 2D array:

 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; } 

If you want to do the opposite (2D โ†’ 1D), here is the function:

 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; } 
+3
source
 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++; } 
+1
source

You will often find the same problem: how to manipulate a 2D array as a 1D array. I wrote a generic Grid class that allows you to access objects using index or (x, y) .

See the following class and understand its idea. :)

You can use the following class to process data as a 2D array or 1D array. Here is the code that I wrote and use.

 /** * Grid represents a 2 dimensional grid. * * @param <E> 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<E> { private int size ; private int width ; private int height ; private List<E> 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<E>( Collections.nCopies(width*height, (E)null)); } public int getHeight() { return height; } public int getWidth() { return width; } /** * @return all elements of the grid */ public List<E> getElements() { return elements; } /** * @return iterator for a grid */ public Iterator<E> 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; } } 

Here's how to use the class (see test case):

 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<Integer> 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; } } 
+1
source

You cannot โ€œconvertโ€ a 1D array to a 2D array, but the array can be multidimensional when you declare it.

 int myArray2d[][] = new int[10][3] 
-2
source

All Articles