floatmap 二维数组_用J中的多维数组进行Arrays.fill
用J中的多維數(shù)組進(jìn)行Arrays.fill
如何在不使用循環(huán)的情況下用Java填充多維數(shù)組? 我試過了:
double[][] arr = new double[20][4];
Arrays.fill(arr, 0);
結(jié)果為java.lang.ArrayStoreException: java.lang.Double
提前致謝!
11個解決方案
87 votes
這是因為new是1.0的數(shù)組,您無法將0.0分配給它(就像double[] vector = 0.0一樣)。 實際上,Java沒有真正的多維數(shù)組。
碰巧,new是Java中double的默認(rèn)值,因此當(dāng)從new中獲取矩陣時,矩陣實際上已經(jīng)被零填充了。但是,如果要用1.0進(jìn)行填充,則可以執(zhí)行以下操作:
我不認(rèn)為API提供了無需循環(huán)即可解決此問題的方法。 然而,使用for-each循環(huán)非常簡單。
double[][] matrix = new double[20][4];
// Fill each row with 1.0
for (double[] row: matrix)
Arrays.fill(row, 1.0);
aioobe answered 2020-01-11T05:42:20Z
60 votes
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);
trojanfoe answered 2020-01-11T05:42:35Z
9 votes
OP詢問如何無循環(huán)解決此問題! 由于某些原因,如今避免循環(huán)很流行。 為什么是這樣? 可能已經(jīng)意識到,使用map、Function、eval和朋友,以及諸如exec之類的方法可以隱藏循環(huán)并減少程序的詳細(xì)信息,并且很酷。 真正好的Unix管道也是如此。 或jQuery代碼。 事情看起來很好,沒有循環(huán)。
但是Java是否有map方法? 并非如此,但是我們可以使用eval或exec方法或eval接口定義一個帶有Function接口的接口。 這不太困難,將是一個很好的練習(xí)。 它可能很昂貴,并且實際上沒有使用。
沒有循環(huán)的另一種方法是使用尾遞歸。 是的,這很愚蠢,也沒有人會在實踐中使用它,但是它確實表明,在這種情況下,循環(huán)很好。 盡管如此,僅為了展示“另一個免費循環(huán)示例”并獲得樂趣,這里是:
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的問題時,沒有明確的循環(huán)。
Ray Toal answered 2020-01-11T05:43:10Z
5 votes
根據(jù)Java 8,我們可以使用這種方式。
double[][] arr = new double[20][4];
Arrays.stream(arr).forEach(a -> Arrays.fill(a, 0));
我們可以用一種更好,更智能的方式在多維數(shù)組中初始化一個值。
Bipool answered 2020-01-11T05:43:38Z
4 votes
如何在不使用循環(huán)的情況下用Java填充多維數(shù)組?
多維數(shù)組只是數(shù)組的數(shù)組,Array不會檢查數(shù)組的類型和您傳遞的值(此責(zé)任在開發(fā)人員身上)。
因此,如果不使用循環(huán),就無法合理地填充多維數(shù)組。
請注意,與C或C ++之類的語言不同,Java數(shù)組是對象,而在多維數(shù)組中,除最后一級外,所有數(shù)組都包含對其他Array對象的引用。 我對此不是100%的確定,但是很可能它們是分布在內(nèi)存中的,因此您不能只填充沒有循環(huán)的連續(xù)塊,就像C / C ++可以做到的那樣。
Thomas answered 2020-01-11T05:44:13Z
3 votes
作為答案的擴展,我找到了這篇文章,但希望填充4維數(shù)組。原始示例只是一個二維數(shù)組,但問題是“多維”。 我不想為此發(fā)布新的問題...
您可以使用相同的方法,但是必須嵌套它們,以便最終獲得一維數(shù)組。
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);
}
}
};
k3yz101 answered 2020-01-11T05:44:42Z
1 votes
有時我們所有人都不希望有一個
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[]是合法且定義明確的…)
(從下面使用一種公共方法可以使調(diào)用源代碼保持循環(huán)。
如果您堅持不使用任何循環(huán),請使用遞歸將循環(huán)和對Arrays.fill()(!)的調(diào)用替換。)
/** 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 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 void fill(Object[] m, T value, int dimensions) {
if (null != m)
filler(m, value, dimensions);
}
static 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);
}
greybeard answered 2020-01-11T05:45:32Z
0 votes
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]);
}
}
我希望這做得好
Ahmed Mazher answered 2020-01-11T05:45:54Z
0 votes
使用Java 8,您可以聲明和初始化二維數(shù)組,而無需使用(顯式)循環(huán),如下所示:
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][]);
這將使用默認(rèn)值初始化數(shù)組(在double的情況下為DoubleStream)。
如果要顯式定義要使用的填充值,可以添加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][]);
Robby Cornelissen answered 2020-01-11T05:46:23Z
0 votes
簡而言之,java不提供此類API。您需要遍歷循環(huán),并使用fill方法可以用一個循環(huán)填充2D數(shù)組。
int row = 5;
int col = 6;
int cache[][]=new int[row][col];
for(int i=0;i<=row;i++){
Arrays.fill(cache[i]);
}
Sanjeev Guglani answered 2020-01-11T05:46:43Z
-5 votes
Arrays.fill(arr, new double[4]);
watereater answered 2020-01-11T05:46:59Z
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的floatmap 二维数组_用J中的多维数组进行Arrays.fill的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10防火墙在哪?
- 下一篇: 火柴人_火柴人 x THANKSGIVI