Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类无法识别索引_Java_Arrays - Fatal编程技术网

Java类无法识别索引

Java类无法识别索引,java,arrays,Java,Arrays,我用JAVA制作了一个矩阵类,它由一个带有行和列变量的2D int数组组成。该类的构造函数生成一个维数为nxm的矩阵,我还实现了两个方法来打印矩阵的值及其转置(getMatrixValues和getTransposedValues) 然而,我想创建一个函数,该函数以矩阵作为输入并返回其转置,但由于该类不是数组,如果我正确理解IntelliJ返回我的异常(“java:array required,但matrix found”),我无法使用AT[j][I]=a[I][j]对其进行迭代。 显然,我可以

我用JAVA制作了一个矩阵类,它由一个带有行和列变量的2D int数组组成。该类的构造函数生成一个维数为nxm的矩阵,我还实现了两个方法来打印矩阵的值及其转置(
getMatrixValues
getTransposedValues

然而,我想创建一个函数,该函数以矩阵作为输入并返回其转置,但由于该类不是数组,如果我正确理解IntelliJ返回我的异常(“java:array required,但matrix found”),我无法使用
AT[j][I]=a[I][j]
对其进行迭代。 显然,我可以简单地使用int[][]类来开始,而不是定义一个新的类,但由于我对JAVA和面向对象编程基本上是新手,我想知道如果不放弃我的Matrix类,是否还有其他可能性

这是我的密码:

import java.util.Random;
import java.util.Arrays;

public class Matrix {


    private int n; // rows
    private int m; // cols
    private int[][] A; // matrix

    public static void main(String[] args){
        Matrix A = new Matrix(4,4);

        A.getMatrixValues();

        System.out.println("\n");
        
        A.getTransposedValues();
        
        Matrix AT = transposeMatrix(A);     
    }

    // constructor (randomly generates matrix)
    public Matrix(int rows, int cols){

        n = rows;
        m = cols;

        A = new int[rows][cols];

        Random r = new Random();
//        r.setSeed(1);

        for(int i = 0; i < rows; i++)
        {
            for(int j = 0; j < cols ; j++)
            {
                A[i][j] = r.nextInt(10);
            }
        }
    }

    // print matrix
    public void getMatrixValues(){
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                System.out.print(A[i][j]+"\t");
            }

            System.out.print("\n");
        }
    }

    // print transposed matrix
    public void getTransposedValues(){
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                System.out.print(A[j][i]+"\t");
            }

            System.out.print("\n");
        }
    }


    public static Matrix transposeMatrix(Matrix A){

        Matrix AT = new Matrix(A.get_n(), A.get_m());

        for(int i = 0; i < A.get_n(); i++)
        {
            for(int j = 0; j < A.get_m(); j++)
            {
                AT[j][i] = A[i][j];
            }
        }

    return AT;
    }

    // getters
    public int get_n(){
        return n;
    }

    public int get_m(){
        return m;
    }


}


import java.util.Random;
导入java.util.array;
公共类矩阵{
私有int n;//行
私有int m;//cols
私有int[][]A;//矩阵
公共静态void main(字符串[]args){
矩阵A=新矩阵(4,4);
A.getMatrixValues();
System.out.println(“\n”);
A.getTransposedValues();
矩阵AT=转置矩阵(A);
}
//构造函数(随机生成矩阵)
公共矩阵(整数行,整数列){
n=行;
m=cols;
A=新整数[行][cols];
随机r=新随机();
//r.固定种子(1);
对于(int i=0;i对于(int i=0;i前言
我后来才注意到,在创建转置矩阵时,实际上需要创建一个包含m行和n列的矩阵。
这意味着,在实例化新对象时,您在
transpossematrix()
中混淆了
m
n

这也意味着您的代码(实际上)只适用于平方矩阵。只需创建如下对象:
新矩阵(Matrix.get\m(),Matrix.get\n())

注意:我重新命名了变量;请参见下面的“解决方案”部分

然而,由于这不是您问题的一部分,我没有在下面的代码片段中修复它

范围
在其他方法中,您处于所处对象的词法范围内。这允许您访问其字段(如
int[][]A

但是当在
TransposeSmatrix(矩阵A)
内时,您在
静态范围内,这意味着,不在对象的范围内。
更让人困惑的是,您的实例变量被称为
A
,非常类似于
transpossematrix()的参数
矩阵A
。虽然可以通过
A
访问2D数组,但现在可以通过
A
访问
矩阵
-对象。这既是因为我们不再在对象中,也是因为新的局部变量覆盖了对类似命名的实例/静态变量的访问(您必须分别使用
this.A
Matrix.A

访问修饰符
在尝试修复代码时,您将偶然发现所使用的访问修饰符的限制:
private
private int[][]A
将使
A
(您的数组)仅在从对象内部引用时才可访问。但是当调用
transposeSematrix()
时,我们处于静态上下文中,这意味着不再位于对象内部

若要解决此问题,可以更改访问修饰符以允许我们从对象外部访问该字段。若要启用此功能,您可以将修饰符更改为任何其他选项,最简单的方法是将其删除。不过,我建议您在官方文档中阅读更多信息

解决方案
假设我们从
int[]A
中删除了
private
。这段代码行得通吗?
不。这是因为我在解释作用域时谈到了混淆。为了消除混淆,让我们重命名一些变量:(将
int[]]A
更改为
int[]]array
Matrix A
更改为
Matrix Matrix
Matrix AT
更改为
Matrix Matrix transposed


int[]]array;//无关:使用对字段有意义的名称(实际上,对于您所做的任何事情)。为什么要编写
private int n;//rows
而不仅仅是
private int rows
?!每次添加这样的注释来解释您的名字…那么这个名字可能是不好的,值得改进。另外请注意,您只对某些常量使用“u”下划线,方法名的大小写类似于,
getN()
取而代之。最后一部分只是命名约定。它本身并没有错,但老师可能会发现它错了,并且在使用它时会让许多Java程序员感到困惑。您的
get\n()
是所谓的“snake\u case”,但Java的命名约定通常是“camelCase”。我会记住这一点,我感谢您的输入!