【问题标题】:Comparison between two int arrays results unexpected两个 int 数组之间的比较结果出乎意料
【发布时间】:2020-05-04 18:41:51
【问题描述】:

我正在尝试比较两个棋盘(由int[][] 表示)。我也用 C++ 编写了相同的算法,并且在比较棋盘是否相等时没有问题。

我正在尝试在此处发布最相关的代码。关于“二维”数组之间的比较,我是否遗漏了任何 Java 基础知识?或者它可能与内存/存储相关,因为它没有整理出解决方案的重复项?我试图为列表中的棋盘分配新内存,但这以无限循环结束。

我还使用了多种方法来比较板子,即使是 .equals、.deepEquals,也适用于每次迭代和集合。

这是比较函数中的代码 sn-p,用于检查是否相等,并在每次镜像和旋转时由 TrulyUnique 函数调用。我正在比较 2 个类型为 int[][] 的变量,称为 storeCurrentBoardplayboard

        int [][] storeCurrentBoard;
        for(int k = 0; k < QList.size(); k++)
        {
            //isPresentinList = true;
            storeCurrentBoard = QList.get(k);

            for(int i = 0; i < playboard.length; i++) 
            {
                for(int j = 0; j < playboard[i].length; j++)
                {
                    if(playboard[i][j] != storeCurrentBoard[i][j])
                    {
                        isPresentinList = false;
                        break;
                    }
                }
            }
        }

【问题讨论】:

  • playboard[][] 是 int[][] 还是 Integer[][] ?
  • @Hades playboard[][] 是 int[][]。对于 deepEquals,我使用了 Integer,但结果是一样的。
  • isPresentInList = true 被注释掉是有原因的吗?因为不应该。否则,一旦设置为 false,它将始终保持为 false。
  • 抱歉,我应该发布整个函数...在函数开始时它设置为 true!
  • 那就是问题所在。每次进入外部 for 循环时,它都应该设置为 true。取消注释 //isPresentInList = true 部分

标签: java arrays memory


【解决方案1】:

您已将isPresentInList = true 注释掉。取消注释它。按照您现在的方式,如果 isPresentInList 被设置为 false,它将始终保持为 false,从而使您之后的所有板子始终不相等。

    boolean isPresentInList;
    int [][] storeCurrentBoard;
    for(int k = 0; k < QList.size(); k++)
    {
        isPresentinList = true; //This is necessary for everything to work
        storeCurrentBoard = QList.get(k);

        outer: for(int i = 0; i < playboard.length; i++) 
        {
            for(int j = 0; j < playboard[i].length; j++)
            {
                if(playboard[i][j] != storeCurrentBoard[i][j])
                {
                    isPresentinList = false;
                    break outer;
                }
            }
        }
    }

【讨论】:

  • 这确实是比较问题之一,谢谢!但导致真正问题的原因是我的一种方法改变了播放板,这样做导致程序一遍又一遍地计算第二个播放板,这就是它陷入无限循环的原因!
猜你喜欢
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多