Java:如何将一个二维数组拆分成两个二维数组

3

我正在编写一个尽可能高效地乘矩阵(2D数组)的程序,为此需要将我的两个数组分成两个,并将它们发送到第二个程序中进行乘法运算。 我遇到的问题是如何在特定点(中间位置)将2D数组分成两个2D数组。 有人有什么想法吗?


1
你做了什么,魔术先生? - Naftali
将二维数组"一半"分割是什么意思? - Pops
1个回答

8
假设你有一个二维字符串数组,如下所示:

String[][] array= new String[][]
{
    {"a","b","c"},
    {"d","e","f"},
    {"h","i","j"},
    {"k","l","m"}
};

现在你需要一种方法在中间点将这些数组分割开来。让我们先找到中间点。计算出数组的大小,然后将其分成两半。请注意,您还必须处理数组长度不是偶数的情况。例如,长度为3。如果是这种情况,我们将使用 Math.floor() 函数。

int arrayLength = array.length;
int halfWayPoint = Math.floor(arrayLength/2);
//我们还需要知道数组中有多少元素
int numberOfElementsInArray = array[0].length;

现在我们拥有了创建两个二维数组所需的所有信息。接下来,我们必须显式地复制并移动数据。

//第一个数组的长度将是我们已经得到的中间点
String [][] newArrayA = new String[halfWayPoint][numberOfElementsInArray];
//这将复制数据
for(int i = 0; i < halfWayPoint; i++)
{
    newArrayA[i] = array[i];
}
//现在创建另一个数组 int newArrayBLength = array.length - halfWayPoint; String[][] newArrayB = new String[newArrayBLength][numberOfElementsInArray]; /* * 这将复制数据。请注意,for循环从halfWayPoint开始。 * 这是因为这是我们在第一个数组中复制的位置。 */ for(int i = halfWayPoint; i < array.length; i++) { newArrayB[i] = array[i]; }
完成了!
现在,如果你想做得更好一些,可以像这样做:

int half = Math.floor(array/2);
int numberOfElementsInArray = array[0].length;
String [][] A = new String[half][numberOfElementsInArray];
String [][] B = new String[array.length - half][numberOfElementsInArray];
for(int i = 0; i < array.length; i++)
{
    if(i < half)
    {
        A[i] = array[i];
    }
    else
    {
        B[i] = array[i];
    }
}
最后,如果您不想显式地执行此操作,可以使用内置函数。 System.arraycopy() 就是其中之一。这是一个链接到其API的链接: System.arraycopy()

// 将数组分成两半
int half = Math.floor(array/2);
// 获取数组中元素个数
int numberOfElementsInArray = array[0].length;
// 创建两个新的二维字符串数组
String [][] A = new String[half][numberOfElementsInArray];
String [][] B = new String[array.length - half][numberOfElementsInArray];
// 将原始数组的前一半复制到A数组中
System.arraycopy(array,0,A,0,half);
// 将原始数组的后一半复制到B数组中
System.arraycopy(array,half,B,0,array.length - half);


我对这个解决方案的问题在于,我的编译器不喜欢使用这行代码将2D数组部分分配给普通数组:newArrayA [i] = array[i]; 有没有什么解决办法? - user650309
我已经成功地将这个程序应用到数组的前一半(包括上半部分和左半部分),但是它无法适用于后一半。我不断收到索引越界异常的提示。 - user650309
我做了一个小改动,请试一下。但是你采用了哪种方法?第一种、第二种还是第三种? - user489041
代码 int[][] newArrayC = new int[length-half][ROW]; for(int i = halfwayPoint; i < length; i++) { for(int j = 0; j < length; j++) { newArrayC[i][j] = array[i][j]; } } 这段代码适用于数组大小为[ROW][ROW]的情况,但显然前一半都是0,如果我尝试其他任何东西,就会出现索引越界异常。很烦人。不过还是感谢你到目前为止的帮助。 - user650309
这是因为您将数组初始化为 new int[length-half][ROW],但在您的循环中,i 的范围是从 0...length。因此,i 的值将大于该数组允许的第一个索引。应该像这样修改 for(int i = 0; i < length - half; i++) - user489041

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接