Arrays.fill在Java中使用多维数组

Car*_*ine 54 java arrays multidimensional-array

如何在不使用循环的情况下在Java中填充多维数组?我试过了:

double[][] arr = new double[20][4];
Arrays.fill(arr, 0);
Run Code Online (Sandbox Code Playgroud)

这导致了 java.lang.ArrayStoreException: java.lang.Double

提前致谢!

aio*_*obe 88

这是因为a double[][]是一个double[]你无法分配的数组0.0(就像这样做double[] vector = 0.0).事实上,Java没有真正的多维数组.

实际上,它0.0 Java中双精度数的默认值,因此当你得到矩阵时,矩阵实际上已经用零填充了new.但是,如果您想填充它,比如说,1.0您可以执行以下操作:

我不相信API提供了一种方法来解决这个问题而不使用循环.然而,使用for-each循环来做它很简单.

double[][] matrix = new double[20][4];

// Fill each row with 1.0
for (double[] row: matrix)
    Arrays.fill(row, 1.0);
Run Code Online (Sandbox Code Playgroud)

  • 我在线程"main"java.lang.ArrayStoreException:java.lang.Double`中得到`异常,除非我遍历行. (2认同)

tro*_*foe 62

double[][] arr = new double[20][4];
Arrays.fill(arr[0], 0);
Arrays.fill(arr[1], 0);
Arrays.fill(arr[2], 0);
Arrays.fill(arr[3], 0);
Arrays.fill(arr[4], 0);
Arrays.fill(arr[5], 0);
Arrays.fill(arr[6], 0);
Arrays.fill(arr[7], 0);
Arrays.fill(arr[8], 0);
Arrays.fill(arr[9], 0);
Arrays.fill(arr[10], 0);
Arrays.fill(arr[11], 0);
Arrays.fill(arr[12], 0);
Arrays.fill(arr[13], 0);
Arrays.fill(arr[14], 0);
Arrays.fill(arr[15], 0);
Arrays.fill(arr[16], 0);
Arrays.fill(arr[17], 0);
Arrays.fill(arr[18], 0);
Arrays.fill(arr[19], 0);
Run Code Online (Sandbox Code Playgroud)

  • 由于问题中的以下词语:"不使用循环".我的解决方案显然很荒谬,但它确实正确回答了这个问题. (77认同)
  • 不,这也是一个有趣的实验:你可以得到多少个正确的答案? (19认同)
  • 你好.我只是想知道为什么你建议这个解决方案而不是经典的`for`.有动力吗?谢谢! (3认同)
  • 对不起,错过了OP的"不使用循环":删除了我的投票.也许你应该在答案中说明这个建议不应该太认真. (2认同)
  • @Bart:没问题-没关系:D (2认同)

Ray*_*oal 10

OP询问如何在没有循环的情况下解决这个问题!出于某种原因,这些天来避免循环很流行.为什么是这样?有可能是一个实现,使用map,reduce,filter,和朋友,以及类似的方法each隐藏循环和削减计划verbage并且是挺酷的.真正甜蜜的Unix管道也是如此.或jQuery代码.没有循环,事情看起来很棒.

但Java有一个map方法吗?不是真的,但我们可以Function使用带有evalexec方法的接口定义一个.这不是一件难事,也是一项很好的锻炼.它可能很昂贵而且在实践中没有使用.

没有循环的情况下执行此操作的另一种方法是使用尾递归.是的,它有点愚蠢,没有人会在实践中使用它,但它确实表明,在这种情况下循环是好的.尽管如此,只是为了展示"又一个循环免费示例"并获得乐趣,这里是:

import java.util.Arrays;
public class FillExample {
    private static void fillRowsWithZeros(double[][] a, int rows, int cols) {
        if (rows >= 0) {
            double[] row = new double[cols];
            Arrays.fill(row, 0.0);
            a[rows] = row;
            fillRowsWithZeros(a, rows - 1, cols);
        }
    }

    public static void main(String[] args) {
        double[][] arr = new double[20][4];
        fillRowsWithZeros(arr, arr.length - 1, arr[0].length);
        System.out.println(Arrays.deepToString(arr));
    }
}
Run Code Online (Sandbox Code Playgroud)

它并不漂亮,但在回答OP的问题时,没有明确的循环.


小智 5

根据Java 8,我们可以使用这种方式。

double[][] arr = new double[20][4]; Arrays.stream(arr).forEach(a -> Arrays.fill(a, 0));

我们可以用一种更好,更智能的方式在多维数组中初始化一个值。

  • @JianwuChen OP要求在没有循环的情况下填充数组 (3认同)
  • 我觉得从可读性的角度来看这并不比 for 循环更好。 (2认同)