如何根据ArrayList中的值更改一个布尔值?

时间:2013-12-01 20:43:29

标签: java arraylist while-loop boolean sudoku

我正在尝试制作一个用于解决数独谜题的演绎算法。我的电路板由ArrayList中的81个节点组成。 - 每个节点都有一个布尔值 我希望我的算法(称为CRME)继续尝试解决难题,如果它发现至少有一个节点的布尔值(hasChanged)等于true,但我不确定如何做到这一点。 canChange也是此方法包含在类中的全局变量。

public void CRME() {
    canChange = true;
    while (canChange == true) {
        for (Node node : cells) {
            scanColumn(node);
            scanRow(node);
            scanMiniGrid(node);
        }
    }

}

    public void scanRow(Node n){
    for(Node node : cells){
        int arraySize = node.posVals.size();
        ArrayList<Integer> toRemove = new ArrayList<Integer>();
        if(node.get_ROW_ID() == n.get_ROW_ID()){
            toRemove.add(node.getValue());
        } 
        n.posVals.removeAll(toRemove);
        if(arraySize < node.posVals.size()){
            node.hasChanged = true;
        }
    }
}

这是scanRow方法,其他两个类似命名的方法是相同的但是更改了明显的语法,例如node.get_ROW_ID();将是node.get_COL_ID();。

2 个答案:

答案 0 :(得分:0)

我假设你有一个静态变量

static boolean hasChanged; // in the Node class

所以你可以使用:

 node.hasChanged = true;

或者您可以创建hasChange方法来设置变量,如此

boolean hasChanged;

public void hasChanged(boolean val){
    this.hasChanged = val;
}

并在循环中使用,如下所示:

hasChanged(true); or hasChanged(false);

答案 1 :(得分:0)

不是说您的方法最好,但如果您尝试在hasChanged true之一的任何节点上继续播放,则以下内容就足够了:

public void CRME() 
{
    goOn = false;

    for (Node node : yourArrayListOfNodes) 
    {
        if (node.hasChanged)
        {
           goOn = true;
           break;
        }
    }

    if (goOn)
    {
        //Insert Whatever code you want to run after the check
        //.........................................

        //Use recursion to repeat process
        //Note recursive call will only take place if goOn is true
        CRME()
    } 
}

这似乎就是你想做的事情,请注意,如果你的逻辑不正确,你可以得到一个StackOverflowError,因为你会继续进行递归调用。