【问题标题】:Java how to find the middle of a 2d arrayJava如何找到二维数组的中间
【发布时间】:2016-07-27 14:58:52
【问题描述】:

我正在编写一个试图找到二维数组中间的函数,这就是我目前所拥有的:

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

假设我有一个数组

{{0, 1, 2, 3},
 {4, 5, 6, 7},
 {8, 9, 0, 1}}

它应该返回 6,因为它是整数除法。 另外,这段代码中middle的定义是整个原始数组的中间整数(有无排序不用说)。

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

【问题讨论】:

  • 数组是否按行排序?如果没有,您可以按行对数组进行排序,然后取中间列的中间元素。
  • 冒泡排序然后取中间数组的中间值。哈哈。
  • 我认为您误用了“中位数”一词,从而使人们感到困惑。你的意思是你想要数组的中间值,而不是统计意义上的中值。我建议您将问题中的“中位数”更改为“中间”以避免混淆。

标签: java arrays multidimensional-array compiler-errors


【解决方案1】:

这会编译,并且会给你序列中的中间数字,或者如果它分裂中间,则为中间两个的平均值:

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

但是,我怀疑在将数字组合成一个数组之后,在找到中间数字之前,您会想要对数字进行排序。 (正如 piyush121 评论的那样)

【讨论】:

  • 我忘了说在找到中位数之前不需要对数组进行排序
【解决方案2】:

假设您对“中位数”的定义是正确的(奇数集的中间数或偶数集的两个中间数的平均值),并且如果 grid[][] 已排序,并且如果 grid[ ][] 是一个方形数组(即 grid.length = grid[i].length for all i in 0..length-1,那么你不需要将数据复制到另一个数组。以下应该足够了:

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

【讨论】:

    【解决方案3】:

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

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

    为了您的兴趣,这里有一个 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多