Java如何找到2d数组的中间

Java如何找到2d数组的中间,java,arrays,multidimensional-array,compiler-errors,Java,Arrays,Multidimensional Array,Compiler Errors,我正在编写一个函数,试图找到2d数组的中间部分,到目前为止,我得到的是: int findMiddle(int[][] grid,int [] m) { int[] list = new int[grid.length*grid[0].length]; int listPos = 0; for(int i = 0 ; i < grid.length; i++) { for(int j = 0; j < grid.length; j++) {

我正在编写一个函数,试图找到2d数组的中间部分,到目前为止,我得到的是:

int findMiddle(int[][] grid,int [] m) {
    int[] list = new int[grid.length*grid[0].length];
    int listPos = 0;
    for(int i = 0 ; i < grid.length; i++) {
        for(int j = 0; j < grid.length; j++) {
            list[listPos++] = grid[i][j];
        }
    }
    int middle = m.length/2;
    if (m.length%2 == 1) {
        return m[middle];
    } else {
        return (m[middle-1] + m[middle]) / 2.0;
    }
}
它应该返回6,因为它是整数除法。 此外,在这段代码中,middle的定义是整个原始数组的中间整数(不用说它是否被排序)


我该怎么做?(我的代码也不编译)

这将编译,并将给出序列中的中间数,或者如果将中间数拆分,则给出中间两个数的平均值:

  static double findMiddle(int[][] grid) {
    int[] list = new int[grid.length*grid[0].length];
    int listPos = 0;
    for(int i = 0 ; i < grid.length; i++) {
        for(int j = 0; j < grid[i].length; j++) {
            list[listPos++] = grid[i][j];
        }
    }
    int middle = list.length/2;
    if ((list.length%2) == 1) {
        return list[middle];
    }
    return (list[middle-1] + list[middle]) / 2.0;
  }
静态双findmddle(int[]]grid){
int[]list=new int[grid.length*grid[0].length];
int-listPos=0;
对于(int i=0;i

但是,我怀疑在将数字合并到一个数组中之后,在找到中间的数字之前,您会希望对这些数字进行排序。(正如piyush121所评论的)

假设您对“中间值”的定义是正确的(奇数长度集的中间数或偶数长度集的两个中间数的平均值),并且如果网格[]已排序,并且网格[]是方形数组(即grid.length=grid[i].length,则不需要将数据复制到另一个数组。以下内容应足够:

 static int findMiddle(int[][] grid) {
    int l = grid.length;
    if (l%2 == 1) {
       return grid[l/2][l/2];
    } else {
    return (grid[l/2-1][l-1]+grid[l/2][0])/2;
 };

查看您现有的代码,如果所有值都放在一个单行列表中,您似乎将“中值”定义为矩阵中的中间值。换句话说,您不需要处理奇数行(当同一列中的两个数字位于中间时)或奇数行和列(中间有四个数字时)

如果该定义是正确的,那么您可以通过流式传输所有值,然后选择中间的值来处理不均匀行的所有复杂性

出于您的兴趣,这里有一个Java 8解决方案可以做到这一点:

int[] flat = Arrays.stream(grid).flatMapToInt(Arrays::stream).toArray();
double middle = Arrays.stream(flat).skip(flat.length / 2).limit(1 + flat.length % 2)
    .average().getAsDouble();

数组是按行排序的吗?如果不是,你可以按行排序,然后取中间列的中间元素。冒泡排序,然后取中间数组的中间值。哈。我认为你误用了“中值”一词,让人们感到困惑。你的意思是你想要数组的中间值,而不是统计学家的中值从逻辑上讲,我建议你把问题中的“中间值”改为“中间值”,以避免混淆。我忘了说在找到中间值之前不需要对数组进行排序
int[] flat = Arrays.stream(grid).flatMapToInt(Arrays::stream).toArray();
double middle = Arrays.stream(flat).skip(flat.length / 2).limit(1 + flat.length % 2)
    .average().getAsDouble();