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