2016-12-01 86 views
0

我想用数组和Arrays.fill方法创建一个随机的5x5矩阵。 这是我做过什么:如何用数组创建一个随机矩阵

import java.util.*; 

class RandomMatrix { 
    public static void main (String [] args) { 

     int i,j; 
     int [] [] matrix = new int [5] [5]; 
     Arrays.fill (matrix, (int) Math.random()*10); 

     for (i=0; i<matrix.length; i++) { 
      for (j=0; j<matrix[i].length; j++) { 

       System.out.printf("%-5d", matrix [i][j]); 
      }   
      System.out.println(); 
     }   
    } 
} 

实际上我认为它会以这种方式工作,但现在我得到这个错误:

Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer 
    at java.util.Arrays.fill(Unknown Source) 
    at RandomMatrix.main(RandomMatrix.java:8) 
+0

你意识到你没有创造25个随机选择的元素5x5矩阵,但5x5矩阵,其中所有元素都是平等(但,随机选择)? –

+0

2D数组是数组的数组。所以你必须用'int []'而不是'int'填充'matrix'(这是一个int []')的数组。因此'ArrayStoreException'。 – Gendarme

+0

Math.random()>以正号返回一个double值,大于或等于0.0且小于1.0。如果当你转换为整数时0 <= 0.5,那么它等于0,0 * 10 = 0无效的数组赋值尺寸 – toto

回答

4

使用您用于打印的矩阵相同的循环结构。

for (int i=0; i<matrix.length; i++) { 
    for (int j=0; j<matrix[i].length; j++) { 
     matrix[i][j] = (int) (Math.random()*10); 
    }   
} 

Arrays.fill()作品上的阵列,你的矩阵是由数组的数组。即使您使用了类似Arrays.fill (matrix[0], (int) Math.random()*10);的东西,也会将相同(随机选择)的值放入行0的每个单元格中。

+0

谢谢你解决这个问题。但实际上我想尝试Arrays.fill方法,因为它今天在大学推出。那么有没有办法用这种方法获得相同的结果? –

+2

我不这么认为。任何用作'fill(...)'参数的表达式在实际调用方法之前都会解析,因此它为每个单元使用相同的值,这就是'fill(...)'所设计的目的。 –

+0

实际上您所寻找的是一种支持递归数组和供应商提供的值的填充方法。我不认为这是存在的,但如果你碰巧在多个地方碰到这个问题,你可能会考虑至少在2D情况下实现它。 –

-1

Arrays.fill()填充数组。你的矩阵是一个数组的数组,所以不是写作

Arrays.fill (matrix, (int) Math.random()*10); 

你也可以写

int a = (int) Math.random()*10; 
matrix[0] = a; //doesn't work, matrix[0] is an int array! 
matrix[1] = a; //doesn't work, matrix[0] is an int array! 

等。看看它为什么不起作用?这在两个方面是错误的。首先,fill()不支持嵌套数组,其次,fill将值作为参数,而不是供应商。

0

我想你有一个错误,因为方法fill()不能与多维数组一起工作。只是转换它看起来像:

for(int k = 0;k<5;k++){ 
     int[] example = matrix[k]; 
     Arrays.fill (example, new Random().nextInt(10)*10); 
} 
0
int[][] m = new int[5][5]; 

    //https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#fill-int:A-int- 
    //public static void fill(**int[]** a, int val) 
    for(int[] r : m) 
     Arrays.fill(r, (int) (Math.random()*10)); 

    for (int i = 0; i < m.length; i++) { 
     for (int j = 0; j < m.length; j++) { 
      System.out.print(m[i][j] + " "); 
     } 
     System.out.println(""); 
    } 

    System.out.println("Second"); 

    for (int i = 0; i < m.length; i++) { 
     for (int j = 0; j < m.length; j++) { 
      m[i][j] = (int) (Math.random()*10); 
     } 
    }  

    for (int i = 0; i < m.length; i++) { 
     for (int j = 0; j < m.length; j++) { 
      System.out.print(m[i][j] + " "); 
     } 
     System.out.println(""); 
    } 
Output: 
3 3 3 3 3 
4 4 4 4 4 
7 7 7 7 7 
2 2 2 2 2 
8 8 8 8 8 
Second 
0 0 4 9 1 
5 8 6 3 8 
5 7 3 5 1 
1 1 6 4 8 
6 2 1 4 0