java - 设置 boolean 方法总是输出true?

标签 java set

我很难弄清楚为什么方法工作不正确。

我的方法 addtoHash() 始终返回 true,并且由于某种原因它也只在返回 true 之前查看第一个值。

抱歉,如果这有点令人困惑,我的代码应该更好地解释它!

最初我的代码是这样的,而且它确实有效:

  public void addtoHash(Set reserve, int value)
    {
        if(value > 0 && value < 10)
        {
            reserve.add(value)
        }
    }

public boolean squareCheck(int[][][] board, int index)
{
    Set<Integer> reserve = new HashSet<>();

    for(int r = 0; r < board[0].length; r++)
    {
        for(int c = 0; c < board[0].length; c++)
        { 
            addtoHash(reserve,board[index][r][c]);
            if(r == 2 && c == 2 && reserve.size() < 9)
            {
              System.out.println("Error in grid " + index);
              return false;
            }


        }
    }
    return true;

}

因为我想让它更有用,所以我将 addtoHash() 更改为返回 boolean 值:

public boolean addtoHash(Set reserve, int value)
{
    if(value > 0 && value < 10)
    {
        return reserve.add(value) == true;
    }

    return false;
}
public boolean squareCheck(int[][][] board, int index)
{
    Set<Integer> reserve = new HashSet<>();

    for(int r = 0; r < board[0].length; r++)
    {
        for(int c = 0; c < board[0].length; c++)
        { 
            if(!addtoHash(reserve,board[index][r][c]))
                System.out.println("Error at " + index+r+c);
                    return false;
        }
    }
    return true;

}

检查这是否有效:

int[][][] solved = {{{5,3,2},{6,7,2},{1,9,8}}, //My new code doesn't find the duplicate and return false here, despite my previous code having done so!
                    {{6,7,8},{1,9,5},{3,4,2}},
                    {{9,1,2},{3,4,8},{5,6,7}},
                    {{8,5,9},{4,2,6},{7,1,3}},
                    {{7,6,1},{8,5,3},{9,2,4}},
                    {{4,2,3},{7,9,1},{8,5,6}},
                    {{9,6,1},{2,8,7},{3,4,5}},
                    {{5,3,7},{4,1,9},{2,8,6}},
                    {{2,8,4},{6,3,5},{1,7,9}}}; 
validCheck checker = new validCheck();
checker.squareCheck(solved,0);

然而,运行几次并使用System.out.println()后,我发现它总是返回true;打印出 Set 后,我​​发现它只检查第一个值,因此输出将为 [5] true

我的逻辑是否有问题,这就是为什么它总是返回true,或者我还遗漏了什么?

最佳答案

这里的return false是无条件执行的:

        if(!addtoHash(reserve,board[index][r][c]))
            System.out.println("Error at " + index+r+c);
                return false;

因为该代码相当于:

        if(!addtoHash(reserve,board[index][r][c])) {
            System.out.println("Error at " + index+r+c);
        }
        return false;

你需要这个:

        if (!addtoHash(reserve, board[index][r][c])) {
            System.out.println("Error at " + index + r + c);
            return false;
        }

你所做的是一个非常常见的错误。 为此,建议始终在 if 语句中使用大括号, 这样就很容易发现这种错误。


顺便说一句,您可以将 addToHash 简化为:

public boolean addtoHash(Set<Integer> reserve, int value) {
    return 0 < value && value < 10 && reserve.add(value);
}

关于java - 设置 boolean 方法总是输出true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41311608/

相关文章:

java - 如何在 DefaultListModel 中添加 JButton?

java - Jelly中的${it}变量是如何设置的

java - 如何迭代 Map.Entry 的 SortedSet

java - 如何确定位置 Z 是否在起点 X 和终点 Y 的区域内

python - Pandas:以唯一值为条件的连接

list - 如何以惯用的方式在 Scala 中创建嵌套的 toSet?

java - 使用驱动程序中的构造函数

java - 支柱 2 : how to send JSON to action

java - 如何将我的 Java 程序放入系统托盘?

c++ - std::set 与用户定义的类型,如何确保没有重复