如何将一维数组转换为二维数组?

说,我有一个30个元素的1D数组:

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循环吗?
但是我不能解决这个问题。

没有为你写任何代码…

  • 想想你的2Darrays需要多大。
  • 认识到你需要遍历源数组的内容来获取每个值到你的目标数组中。

所以它会看起来像…

  • 创build一个适当大小的二维数组。
  • 使用for循环来遍历你的1d数组。
  • 在for循环中,您需要计算1d数组中每个值应该在2d数组中的位置。 尝试使用对你的计数器variables的mod函数来“环绕”二维数组的索引。

我故意模糊,因为这是作业。 尝试张贴一些代码,以便我们可以看到你卡住的地方。

 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数组转换的generics函数:

 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),这里的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; } 
 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++; } 

你经常会发现同样的问题:如何操纵二维数组作为一维数组。 我写了一个通用类Grid,它允许通过索引(x,y)访问对象。

看下面的课,理解它背后的想法。 🙂

您可以使用以下类作为二维数组或一维数组进行数据操作。 这是我写的和使用的代码。

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

以下是如何使用该类(请参阅testing示例):

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

您不能将一维数组“转换”为二维数组,但是在声明它时,数组可以是多维的。

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