首页 > 解决方案 > Java 数独 ConcurrentModificationException

问题描述

我目前正在研究数独游戏。我在互联网上找到了有趣的回溯算法,但它在我的代码中的工作方式不同,因为我的任务假设是从类列表中生成它。我将展示我的代码,以便您明白我的意思。主要是我有行列表,每行包含一个元素列表,每个元素都包含一个可能放在该位置的数字列表。如果这个数字已经在行、列或框 3x3 中,我想从元素的可能数字中删除每个数字,但是当我遍历所有行时,我的板上的 cols 并尝试删除特定数字会引发错误:ConcurrentModificationException

要实现的目标:主要目标是让算法很好地解决数独问题,但至少现在我想看看何时删除某个元素的一些可能数字,看看算法是否效果更好。因此,如果您能帮助我摆脱在删除元素时在 runAlgorithm() 方法中抛出的这个错误,我将不胜感激。

元素类:

public static final int EMPTY = -1;
private List<Integer> possibleFields = new ArrayList<>();
private int value;

public SudokuElement(int value) {
    this.value = value;
    for (int i=1; i<=9; i++){
        possibleFields.add(i);
    }
}

public List<Integer> getPossibleFields() {
    return possibleFields;
}

public int getValue() {
    return value;
}

public void setElement(int value){
    if (this.value == EMPTY)
        this.value = value;
}

@Override
public String toString() {
    return (value == -1 ? "-" : String.valueOf(value));
}

我的排课:

private List<SudokuElement> elements = new ArrayList<>();

public SudokuRow() {
    for (int i=0; i<9; i++){
        elements.add(new SudokuElement(SudokuElement.EMPTY));
    }
}

public List<SudokuElement> getElements() {
    return elements;
}

我的板类包含行:

    private List<SudokuRow> row = new ArrayList<>();

public SudokuBoard() {
    for (int i=0; i<9; i++){
        row.add(new SudokuRow());
    }
    setElement(0,0,8);
    setElement(2,0,6);
    setElement(2,1,5);
    setElement(1,2,3);
    setElement(1,3,6);
    setElement(2,1,7);
    setElement(2,4,9);
    setElement(2,6,2);
    setElement(3,1,5);
    setElement(3,5,7);
    setElement(4,4,4);
    setElement(4,5,5);
    setElement(4,6,7);
    setElement(5,3,1);
    setElement(5,7,3);
    setElement(6,2,1);
    setElement(6,7,6);
    setElement(6,8,8);
    setElement(7,2,8);
    setElement(7,3,5);
    setElement(7,7,1);
    setElement(8,1,9);
    setElement(8,6,4);
}
public List<SudokuRow> getRow() {
    return row;
}

private boolean checkElementRow(int x, int value){
    return row.get(x).getElements().stream().anyMatch(e -> e.getValue() == value);
}

private boolean checkElementCol(int y, int value){
    return row.stream().anyMatch(e -> e.getElements().get(y).getValue() == value);
}

private boolean checkElementBox(int row, int col, int value){
    int boxRow = row - row % 3;
    int boxCol = col - col % 3;

    for (int i = boxRow; i < boxRow+3; i++)
        for (int j = boxCol; j < boxCol+3; j++)
            if (this.row.get(i).getElements().get(j).getValue() == value)
                return true;
    return false;
}

public boolean isPlaceValid(int x, int y, int val){
    return !checkElementRow(x,val) && !checkElementCol(y,val) && !checkElementBox(x,y,val);
}

public void setElement(int x, int y, int val){
    if (isPlaceValid(x,y,val))
        row.get(x).getElements().get(y).setElement(val);
}

public boolean runAlgorithm() {
    for (int x=0; x < 9; x++){
        for (int y=0; y < 9; y++){
            for (Integer i : row.get(x).getElements().get(y).getPossibleFields()){
                row.get(0).getElements().get(0).getPossibleFields().remove(2);
            }
        }
    }

    return true;
}

标签: javasudoku

解决方案


推荐阅读