如何在不使用循环的情况下用Java填充多维数组?我试过了:
double[][] arr = new double[20][4];
Arrays.fill(arr, 0);
这导致 java.lang.ArrayStoreException: java.lang.Double
如何在不使用循环的情况下用Java填充多维数组?我试过了:
double[][] arr = new double[20][4];
Arrays.fill(arr, 0);
这导致 java.lang.ArrayStoreException: java.lang.Double
Answers:
这是因为adouble[][]
是double[]
您无法分配0.0
给它的数组(就像这样做double[] vector = 0.0
)。实际上,Java没有真正的多维数组。
碰巧的0.0
是Java中double的默认值,因此当您从获取矩阵时,矩阵实际上已经被零填充了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);
Arrays.fill(arr, 0d);
或Arrays.fill(arr, (double)0);
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Double
除非我遍历行。
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);
for
。有动机吗?谢谢!
OP询问如何无循环解决此问题!由于某些原因,如今避免循环很流行。为什么是这样?有可能是一个实现,使用map
,reduce
,filter
,和朋友,和方法,如each
隐藏循环和削减计划verbage并那种很酷的。真正好的Unix管道也是如此。或jQuery代码。事情看起来很好,没有循环。
但是Java有map
方法吗?并非如此,但是我们可以Function
使用eval
orexec
方法来定义一个接口。这不太困难,将是一个很好的练习。它可能很昂贵,并且实际上没有使用。
没有循环的另一种方法是使用尾递归。是的,这很愚蠢,也没有人会在实践中使用它,但是它确实表明,在这种情况下,循环很好。不过,仅为了展示“另一个免费循环示例”并获得乐趣,这里是:
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));
}
}
这不是很漂亮,但是在回答OP的问题时,没有明确的循环。
作为答案的扩展,我找到了这篇文章,但希望填充4维数组。原始示例只是一个二维数组,但问题是“多维”。我不想为此发布新的问题...
您可以使用相同的方法,但是必须嵌套它们,以便最终获得一维数组。
fourDArray = new float[10][10][10][1];
// Fill each row with null
for (float[][][] row: fourDArray)
{
for (float[][] innerRow: row)
{
for (float[] innerInnerRow: innerRow)
{
Arrays.fill(innerInnerRow, -1000);
}
}
};
有时我们所有人都不希望有一个
<T>void java.util.Arrays.deepFill(T[]…multiDimensional)
。存在的问题入手
Object threeByThree[][] = new Object[3][3];
threeByThree[1] = null;
,并
threeByThree[2][1] = new int[]{42};
为完全合法的。
(如果仅Object twoDim[]final[]
是合法且定义明确的…)
(从下面使用一种公共方法可以使调用源代码保持循环。
如果您坚持不使用任何循环,请Arrays.fill()
使用递归替换循环和对(!)的调用。 )
/** Fills matrix {@code m} with {@code value}.
* @return {@code m}'s dimensionality.
* @throws java.lang.ArrayStoreException if the component type
* of a subarray of non-zero length at the bottom level
* doesn't agree with {@code value}'s type. */
public static <T>int deepFill(Object[] m, T value) {
Class<?> components;
if (null == m ||
null == (components = m.getClass().getComponentType()))
return 0;
int dim = 0;
do
dim++;
while (null != (components = components.getComponentType()));
filler((Object[][])m, value, dim);
return dim;
}
/** Fills matrix {@code m} with {@code value}.
* @throws java.lang.ArrayStoreException if the component type
* of a subarray of non-zero length at level {@code dimensions}
* doesn't agree with {@code value}'s type. */
public static <T>void fill(Object[] m, T value, int dimensions) {
if (null != m)
filler(m, value, dimensions);
}
static <T>void filler(Object[] m, T value, int toGo) {
if (--toGo <= 0)
java.util.Arrays.fill(m, value);
else
for (Object[] subArray : (Object[][])m)
if (null != subArray)
filler(subArray, value, toGo);
}
Arrays.fill适用于一维数组,因此要填充二维数组,我们可以在下面进行操作
for (int i = 0, len = arr.length; i < len; i++)
Arrays.fill(arr[i], 0);
public static Object[] fillArray(Object[] arr,Object item){
Arrays.fill(arr, item);
return arr;
}
Character[][] maze = new Character[10][10];
fillArray(maze, fillArray(maze[0], '?'));
for(int i = 0;i<10;i++){
System.out.println();
for(int j = 0;j<10;j++){
System.out.print(maze[i][j]);
}
}
我希望这做得好
maze[2][2] = 'X';
之后fillArray(maze, fillArray(maze[0], '?'));
,您就会感到很大的惊喜。问题是您仅创建一行的一个实例,并且引用了10次。您丢弃创建的原始10行中的9行。
int[][]
数组。Character[][]
之所以Character
可以使用它,是因为它是一个对象。
使用Java 8,您可以声明和初始化二维数组,而无需使用(显式)循环,如下所示:
int x = 20; // first dimension
int y = 4; // second dimension
double[][] a = IntStream.range(0, x)
.mapToObj(i -> new double[y])
.toArray(i -> new double[x][]);
这将使用默认值(0.0
对于double
)初始化数组。
如果要显式定义要使用的填充值,可以添加DoubleStream
:
int x = 20; // first dimension
int y = 4; // second dimension
double v = 5.0; // fill value
double[][] a = IntStream
.range(0, x)
.mapToObj(i -> DoubleStream.generate(() -> v).limit(y).toArray())
.toArray(i -> new double[x][]);
简而言之,java不提供此类API。您需要遍历循环,并使用fill方法可以用一个循环填充2D数组。
int row = 5;
int col = 6;
int cache[][]=new int[row][col];
for(int i=0;i<=row;i++){
Arrays.fill(cache[i]);
}