我正在尝试制作加密程序,用户在其中输入消息,然后将“字母转换为数字”。
例如,用户输入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
)
答案 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;
}
}
}
}
}