java - 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;
}
解决方案
推荐阅读
- git - 解决 Bitbucket 中我无权推送到源或目标分支的合并冲突
- python - 如何在 matplotlib 中做一个 3D 绘图,其中两个函数只用一个变量进行评估?
- javascript - JS / JSX 脚本,用于从所有 Photoshop 图层组及其 Photoshop 图层的所有排列中生成唯一的 PNG
- java - Here Maps Example on Turn-By-Turn Navigation not working [Android Premium SDK]
- java - Java在导入maven包时给出NoClassDefFoundError
- tensorflow - 如何使用 ragged-tensor 在 tensorflow2 中实现以下循环代码?
- oracle - Oracle 存储过程 SQL 查询分配给变量
- install4j - 删除 install4j 中的消息
- python - 如何计算每年每个季节的季节性平均气温?
- c# - 如何在 DataGridView 中显示名称而不是 id?