2016-12-01 13 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の行列を作成していないことを実現しますが、すべての要素が等しい(まだ、ランダムに選ばれた)されている5×5の行列でしたか? –

+0

2D配列は配列の配列です。だから 'matrix'(' int [] 'の配列)を' int'ではなく 'int []'で埋める必要があります。したがって、 'ArrayStoreException'。 – Gendarme

+0

Math.random()> 0.0より大きく1.0より小さい正の符号を持つdouble値を返します。整数にキャストしたときに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()は配列を塗りつぶします。あなたの行列はあなたにもそうで

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! 

とを書くことができ、配列の配列なので、代わりに書き込み

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

の。なぜそれが動作しない参照してください?それは2つの方法で間違っています。まず、fill()はネストされた配列をサポートせず、2番目の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 
関連する問題