2016-12-24 23 views
2

我有困难的时候试图弄清楚为什么方法工作不正确。设置布尔方法始终输出true?

我的方法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()返回一个布尔值,而不是更多的有用:

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;打印出集后,我发现,它只是检查的第一个值,所以输出会[5] true

有什么错我的逻辑,这就是为什么它总是返回true,还是有别的东西,我失踪?

+0

你得到的答案是正确的。另外,对于循环变量,'r'和'c'都迭代到'board [0] .length'。这对我来说似乎是错误的,因为'r'和'c'不在数组的同一维中。 –

回答

4

的这里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); 
} 
相关问题