Java OOP改变2d矩阵的位置?

Java OOP改变2d矩阵的位置?,java,oop,matrix,2d,Java,Oop,Matrix,2d,如果我有一个矩阵,比如3x4,值为 1234 56778 9123 假设用户想要旋转一列: 输入第2列。结果如下: 1634 517 8 922 3 然后我想保存这个矩阵,这样我就可以用另一种方法旋转它的行: 输入第2行;那么结果将是: 1634 1785 9223 公共类矩阵 { int行; int列; int[][]数组=新的int[行][列]; 公共矩阵(整数行,整数列) { this.row=行; this.column=列; this.arrays=newint[行][列]; } pu

如果我有一个矩阵,比如3x4,值为

1234
56778
9123

假设用户想要旋转一列:
输入第2列。结果如下:

1
6
34
5
1
7 8
9
2
2 3

然后我想保存这个矩阵,这样我就可以用另一种方法旋转它的行:
输入第2行;那么结果将是:

1634
1785

9223

公共类矩阵
{
int行;
int列;
int[][]数组=新的int[行][列];
公共矩阵(整数行,整数列)
{
this.row=行;
this.column=列;
this.arrays=newint[行][列];
}
public int getRow()
{
返回行;
}
公共无效集合行(整数行)
{
this.row=行;
}
public int getColumn()
{
返回列;
}
公共void setColumn(int列)
{
this.Column=Column;
}
公共int getArrays()
{
返回数组[行][列];
}
公共void setArray(int行,int列)
{
this.row=行;
this.column=列;
}
公开展览(
{
整数计数=0;
for(int i=0;i

我对Java OOP非常陌生,如果有人能帮助我澄清并指导我的下一步,这将非常有帮助。提前感谢。

首先,我建议对提供的代码进行一些更改:

  • 您有
    数组
    ,这很好,但您没有使用它/填充它(这就是@tumisma在其注释中的意思)。在下面的代码中使用了它
  • 专用字段而不是包专用字段(无修改器)
  • 行/列不需要设置器,只需要构造函数
  • 我会将填充和显示方法分开
  • 您可以使用
    count++
    这是
    count+=1的较短方式/
    count=count+1
  • 将计数重置为1时,可以直接执行此操作(
    count=1;
    ),而不是
    count=0;计数+=1
  • 您不需要在
    System.out.println()中放入任何内容用于空行/输入
  • 这将产生新的代码:

    public class Matrix
    {
        private int amountOfRows;
        private int amountOfColumns;
        private int[][] matrixArray;
    
        public Matrix(int amountOfRows, int amountOfColumns)
        {
            this.amountOfRows = amountOfRows;
            this.amountOfColumns = amountOfColumns;
            matrixArray = new int[amountOfRows][amountOfColumns];
    
            fillMatrixArray();
        }
    
        private void fillMatrixArray()
        {
            int count = 0;
            for(int r = 0; r < amountOfRows; r++)
            {
                for(int c = 0; c < amountOfColumns; c++)
                {
                    if(count < 9)
                    {
                        count++;
                        matrixArray[r][c] = count;
                    }
                    else
                    {
                        // If we reached 9, we reset back to 1
                        count = 1;
                        matrixArray[r][c] = count;
                    }
                }
            }
        }
    
        public int[][] getMatrixArray()
        {
            return matrixArray;
        }
    
        public int getAmountOfRows()
        {
            return this.amountOfRows;
        }
    
        public int getAmountOfColumns()
        {
            return this.amountOfColumns;
        }
    
        public void show()
        {
            for(int r = 0; r < amountOfRows; r++)
            {
                for(int c = 0; c < amountOfColumns; c++)
                {
                    System.out.print(matrixArray[r][c]);
                }
                System.out.println();
            }
            System.out.println();
        }
    
        // TODO: rotateColumn(int columnNr)
    
        // TODO: rotateRow(int rowNr)
    }
    
    输出:

    1234
    5678
    9123
    
    1634
    5178
    9223
    

    我将把
    rotateRow
    -方法的实现留给您。我确信有一种比将列放入单独的数组、旋转并放回更有效/直接的方法,但我找不到它,所以我使用了这种方法来代替。

    首先,我建议对提供的代码进行一些更改:

  • 您有
    数组
    ,这很好,但您没有使用它/填充它(这就是@tumisma在其注释中的意思)。在下面的代码中使用了它
  • 专用字段而不是包专用字段(无修改器)
  • 行/列不需要设置器,只需要构造函数
  • 我会将填充和显示方法分开
  • 您可以使用
    count++
    这是
    count+=1的较短方式/
    count=count+1
  • 将计数重置为1时,可以直接执行此操作(
    count=1;
    ),而不是
    count=0;计数+=1
  • 您不需要在
    System.out.println()中放入任何内容用于空行/输入
  • 这将产生新的代码:

    public class Matrix
    {
        private int amountOfRows;
        private int amountOfColumns;
        private int[][] matrixArray;
    
        public Matrix(int amountOfRows, int amountOfColumns)
        {
            this.amountOfRows = amountOfRows;
            this.amountOfColumns = amountOfColumns;
            matrixArray = new int[amountOfRows][amountOfColumns];
    
            fillMatrixArray();
        }
    
        private void fillMatrixArray()
        {
            int count = 0;
            for(int r = 0; r < amountOfRows; r++)
            {
                for(int c = 0; c < amountOfColumns; c++)
                {
                    if(count < 9)
                    {
                        count++;
                        matrixArray[r][c] = count;
                    }
                    else
                    {
                        // If we reached 9, we reset back to 1
                        count = 1;
                        matrixArray[r][c] = count;
                    }
                }
            }
        }
    
        public int[][] getMatrixArray()
        {
            return matrixArray;
        }
    
        public int getAmountOfRows()
        {
            return this.amountOfRows;
        }
    
        public int getAmountOfColumns()
        {
            return this.amountOfColumns;
        }
    
        public void show()
        {
            for(int r = 0; r < amountOfRows; r++)
            {
                for(int c = 0; c < amountOfColumns; c++)
                {
                    System.out.print(matrixArray[r][c]);
                }
                System.out.println();
            }
            System.out.println();
        }
    
        // TODO: rotateColumn(int columnNr)
    
        // TODO: rotateRow(int rowNr)
    }
    
    输出:

    1234
    5678
    9123
    
    1634
    5178
    9223
    

    我将把
    rotateRow
    -方法的实现留给您。我确信有一种比将列放入单独的数组、旋转并放回更有效/直接的方法,但我找不到它,所以我使用了这种方法。

    你知道你的矩阵不是[[1,2,3,4],[5,6,7,8],[9,1,2,3]],而是这个[[0,0,0,0,0,0]]?您知道您的矩阵不是[[1,2,3,4]、[5,6,7,8]、[9,1,2,3]],而是这个[[0,0,0,0]、[0,0,0,0]、[0,0,0]]?非常感谢您的帮助和帮助edit@Kevin,你能为我提供一些建议,以便我能为这类问题找到自己的解决方案吗?您是否使用了试错法,或者您是如何分解问题以找到您编写的解决方案的。再次谢谢你。如果我宠坏了太多,我很抱歉。我的第一种方法是尝试在现有的2D数组内部旋转列。这并不是真的很好,因为我要么完全错了(比如整个专栏变成了
    2
    ,要么除了最后一个数字,其他都是正确的)。在这种方法中,我还尝试了一个反向for循环(
    for(int r=amountOfRows-1;r>=0;r--)
    ),但也不起作用。然后我提出了列的隔离,旋转它,然后重新插入它,这很容易,虽然没有我想要的那么有效(考虑到3个for循环)。要补充我的评论,是的,我一开始有点反复尝试,但因为花了一点时间,我寻找了一种不太理想但更容易实现的方法,这就是我在回答中所说的。它只在
    rotateColumn
    -方法中对循环执行3次,因此我对解决方案并不满意,也许其他人有一种性能更好的方法来解决您的问题。但它是有效的,而且有点瘦
    1234
    5678
    9123
    
    1634
    5178
    9223