1

是否可以使用引用并将其作为参数传递给方法并在 java 的方法体中进行初始化?我的意思是:我有一个将数组作为参数的方法:

public static void arrayreader(int [] [] m){
int rows,cols;
rows=input.nextInt();cols=input.nextInt();
m = new int [rows][cols];
for(int i=0;i<rows;i++){
    for(int j=0;j<cols;j++){
       m[i][j] = input.nextInt();
       }
   }
}

我想在方法体中而不是在主方法中初始化数组,但java不允许这样做并说它没有初始化

4

5 回答 5

3

如果您将该数组作为返回值而不是参数,则您的 main 方法可能如下所示:

int[][] m = arrayreader();
于 2012-12-27T08:33:31.793 回答
1

你不能,因为当你说:

m = new int [rows][cols];

您有效地将一个新数组分配给“m”引用(指针),因此您丢失了对作为参数传递的数组的引用。

于 2012-12-27T08:33:30.320 回答
1

如果您想在方法中初始化一个数组,则无需将其作为参数传递

你可以做这样的事情

public static int[][] arrayreader()
{
   int rows,cols;
   int[][] result = new int[rows][cols];

   rows=input.nextInt();
   cols=input.nextInt();

   for(int i=0;i<rows;i++)
   {
       for(int j=0;j<cols;j++)
       {
           result[i][j] = input.nextInt();
       }
   }

   return result;
}
于 2012-12-27T08:36:14.007 回答
0

您还可以在 main 中创建数组对象,例如:

int rows,cols;
rows=input.nextInt();cols=input.nextInt();
m = new int [rows][cols];

然后可以具有如下功能:

public static void arrayreader(int [] [] m, int rows, int cols){
 for(int i=0;i<rows;i++){
   for(int j=0;j<cols;j++){
      m[i][j] = input.nextInt();
   }
 }
}
于 2012-12-27T08:46:24.287 回答
0

考虑到由于以下错误,我花了一天时间:

Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:907)

我在下面的代码中实现了上面的所有想法,这就像矩阵乘法的魅力:

import java.util.*;

public class MatmultC
{
private static Scanner sc = new Scanner(System.in);
  public static void main(String [] args)
  {
    int m = sc.nextInt();
    int n = sc.nextInt();
    int a[][] = new int[m][n];
    arrayreader(a,m,n);
    printMatrix(a);

    int[][] b = readMatrix();
    printMatrix(b);

    int[][] c=mult(a,b);
    printMatrix(c);

  }

   public static void arrayreader(int [][] m, int rows, int cols) {
       for (int i = 0; i < rows; i++) {
           for (int j = 0; j < cols; j++) {
              m[i][j] = sc.nextInt();
           }
       }
   }


   public static int[][] readMatrix() {
       int rows = sc.nextInt();
       int cols = sc.nextInt();
       int[][] result = new int[rows][cols];
       for (int i = 0; i < rows; i++) {
           for (int j = 0; j < cols; j++) {
              result[i][j] = sc.nextInt();
           }
       }
       return result;
   }


  public static void printMatrix(int[][] mat) {
  System.out.println("Matrix["+mat.length+"]["+mat[0].length+"]");
       int rows = mat.length;
       int columns = mat[0].length;
       for (int i = 0; i < rows; i++) {
           for (int j = 0; j < columns; j++) {
               System.out.printf("%4d " , mat[i][j]);
           }
           System.out.println();
       }
       System.out.println();
   }

   public static int[][] mult(int a[][], int b[][]){//a[m][n], b[n][p]
   if(a.length == 0) return new int[0][0];
   if(a[0].length != b.length) return null; //invalid dims

   int n = a[0].length;
   int m = a.length;
   int p = b[0].length;

   int ans[][] = new int[m][p];

   for(int i = 0;i < m;i++){
      for(int j = 0;j < p;j++){
         for(int k = 0;k < n;k++){
            ans[i][j] += a[i][k] * b[k][j];
         }
      }
   }
   return ans;
   }

}

其中作为输入矩阵,我们有 inC.txt

4 3
1 2 3
-2 0 2
1 0 1
-1 2 -3 
3 2
-1 3
-2 2
2 1

在 unix 之类的 cmmd 行中执行命令:

$ java MatmultC < inC.txt > outC.txt

你得到输出

outC.txt

Matrix[4][3]
   1    2    3 
  -2    0    2 
   1    0    1 
  -1    2   -3 

Matrix[3][2]
  -1    3 
  -2    2 
   2    1 

Matrix[4][2]
   1   10 
   6   -4 
   1    4 
  -9   -2 
于 2016-03-12T14:56:23.040 回答