2016-12-01 78 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