将一维数组的内容传送到二维数组

时间:2014-11-13 04:12:42

标签: java arrays

我正在尝试制作加密程序,用户在其中输入消息,然后将“字母转换为数字”。

例如,用户输入ABCD作为他的消息。转换后的数字为1 2 3 4,数字存储在一维整数数组中。我想要做的是能够使用二维数组将其放入 2x2 矩阵中。

以下是我的代码片段:

       int data[] = new int[] {10,20,30,40};

       *for(i=0;i<2;i++)
        {
            for(j=0;j<2;j++)
            {
                for (int ctr=0; ictr<data.length(); ictr++){
                a[i][j] = data[ctr];}
            }
        }

我知道代码有问题,但我真的迷路了。

如何将其输出如下?

10 20 
30 40

(而不只是10,20,30,40

4 个答案:

答案 0 :(得分:1)

这是一种做法。这不是唯一的方法。基本上,对于输出中的每个单元格,您计算初始数组的相应索引,然后执行赋值。

int data[] = new int[] {10, 20, 30, 40, 50, 60};
int width = 3;
int height = 2;

int[][] result = new int[height][width];

for(int i = 0; i < height; i++) {
    for(int j = 0; j < width; j++) {
        result[i][j] = data[i * width + j];
    }
}

答案 1 :(得分:1)

看起来你想要输出一个2xn矩阵,同时仍然将值存储在一维数组中。如果是这种情况,那么你可以这样:

假设您的一组值的基数m已知。然后,由于您希望它为2行,因此计算n=ceil(m/2),这将是2xn矩阵的列数。请注意,如果m为奇数,那么您的第二行中只有n-1个值。

然后,对于存储值的数组data(一维数组),只需执行

   for(i=0;i<2;i++)    // For each row
   {
       for(j=0;j<n;j++)    // For each column, 
                           // where index is baseline+j in the original one-dim array
       {
           System.out.print(data[i*n+j]);
       }
   }

但请确保检查奇数基数集的最后一个值。您也可以Integer.toString()来打印值。

答案 2 :(得分:0)

您的代码关闭但不太正确。具体来说,你的最里面的循环( ctr 的循环)并没有实现太多:它只是重复地将当前a[i][j]设置为1-D数组中的每个值,最终结束于每个单元格中数组的最后一个值。你的主要问题是如何将 ctr 纳入这些循环中。

您在这里尝试做的事情有两种一般方法。我所做的一般假设是你想要一个长度 L 的数组打包成 M x N 2-D数组,其中< em> M x N = L 。

第一种方法是迭代2D数组,从1-D数组中提取适当的值。例如(我在下面的尺寸中使用 M N ):

for (int i = 0, ctr = 0; i < M; ++ i) {
    for (int j = 0; j < N; ++ j, ++ ctr) {
        a[i][j] = data[ctr];
    }
} // The final value of ctr would be L, since L = M * N.

在这里,我们使用 i j 作为二维索引,并在0处开始 ctr ,并在我们开始时将其递增逐步通过1-D阵列。此方法有另一种变体,即显式计算源索引而不是使用增量,例如:

for (int i = 0; i < M; ++ i) {
    for (int j = 0; j < N; ++ j) {
        int ctr = i * N + j;
        a[i][j] = data[ctr];
    }
}

第二种方法是迭代遍历1-D阵列,并计算2-D阵列中的目标位置。模数和整数除法可以帮助:

for (int ctr = 0; ctr < L; ++ ctr) {
    int i = ctr / N;
    int j = ctr % N;
    a[i][j] = data[ctr];
}

所有这些方法都有效。根据您的情况,有些可能比其他更方便。请注意,如果您必须同时进行其他转换,则可以更方便地使用两种显式计算的方法,例如:上面的最后一种方法可以让你很容易地水平翻转你的二维矩阵。

答案 3 :(得分:0)

check this solution, it works for any length of data

public class ArrayTest 
    {
        public static void main(String[] args) 
        {
            int data[] = new int[] {10,20,30,40,50};
            int length,limit1,limit2;
            length=data.length;
            if(length%2==0)
            {
                limit1=data.length/2;
                limit2=2;
            }
            else
            {
                limit1=data.length/2+1;
                limit2=2;
            }

            int data2[][] = new int[limit1][limit2];

            int ctr=0;

            //stores data in 2d array
             for(int i=0;i<limit1;i++)
             {
                 for(int j=0;j<limit2;j++)
                 {
                     if(ctr<length)
                     {
                         data2[i][j] = data[ctr];
                         ctr++;
                     }
                     else
                     {
                         break;
                     }
                 }
             }

             ctr=0;
             //prints data from 2d array
             for(int i=0;i<limit1;i++)
             {
                 for(int j=0;j<limit2;j++)
                 {
                     if(ctr<length)
                     {
                         System.out.println(data2[i][j]);
                         ctr++;
                     }
                     else
                     {
                         break;
                     }
                 }
             }
        }

    }