如何使用 BitSet 方法处理 BitSet 类型 table?
How to handle BitSet type table with the BitSet methods?
我必须创建一个具有两种类型 BitSet 维度 (9x9) 的 table。
我用位值 1 到 9 来实现这个 table。
我想撤回特定情况下的值(示例 5),但是 .set 方法 (int, boolean) 修改了我图表中的所有框。
怎么办??
//create
private BitSet[][] solveur = new BitSet[9][9];
//init
BitSet BitInitialisation = new BitSet();
BitInitialisation.set(1, 10);
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
solveur[ligne][colonne] = BitInitialisation;
}
}
//read + method call
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
AjusterLigne(ligne ,5);
}
}
//method "AjusterLigne"
private void AjusterLigne(int ligne, int valeur) {
for (int colonne = 0; colonne < GrilleSudoku.MAX; colonne++){
solveur[ligne][colonne].set(valeur, false);
}
}
结果:空table...
您已经创建了一个包含 BitSet
个引用的 9x9 数组,但是将每个元素值设置为相同的引用 - 只涉及一个 BitSet
对象。这只是一个更复杂的版本:
StringBuilder builder = new StringBuilder();
StringBuilder[] array = { builder, builder };
array[0].append("foo");
System.out.println(array[1]); // Prints foo
如果你真的想要81个独立的BitSet
对象,你需要创建81个不同的BitSet
对象:
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
BitSet bitSet = new BitSet();
bitSet.set(1, 10);
solveur[ligne][colonne] = bitSet;
}
}
理解为什么会这样非常重要 - 这基本上是理解 Java 中引用和对象之间的区别的问题,值得花一些时间时间确保你清楚它......它几乎影响 你在 Java 所做的一切。
那是因为 Java 使用了对象引用。
solveur[ligne][colonne] = BitInitialisation;
在这里,您已在所有 81 个单元格中分配了对 BitInitialisation
的引用。修改其中任何一个都会修改同一个对象。我可以提出两个解决方案:
- 您可以在内循环的每次迭代中创建新的
BitSet
。 (@JonSkeet 的回答涵盖了这一点。)
您可以在 BitSet
对象上调用 .clone()
方法。
solveur[ligne][colonne] = BitInitialisation.clone();
我必须创建一个具有两种类型 BitSet 维度 (9x9) 的 table。 我用位值 1 到 9 来实现这个 table。 我想撤回特定情况下的值(示例 5),但是 .set 方法 (int, boolean) 修改了我图表中的所有框。
怎么办??
//create
private BitSet[][] solveur = new BitSet[9][9];
//init
BitSet BitInitialisation = new BitSet();
BitInitialisation.set(1, 10);
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
solveur[ligne][colonne] = BitInitialisation;
}
}
//read + method call
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
AjusterLigne(ligne ,5);
}
}
//method "AjusterLigne"
private void AjusterLigne(int ligne, int valeur) {
for (int colonne = 0; colonne < GrilleSudoku.MAX; colonne++){
solveur[ligne][colonne].set(valeur, false);
}
}
结果:空table...
您已经创建了一个包含 BitSet
个引用的 9x9 数组,但是将每个元素值设置为相同的引用 - 只涉及一个 BitSet
对象。这只是一个更复杂的版本:
StringBuilder builder = new StringBuilder();
StringBuilder[] array = { builder, builder };
array[0].append("foo");
System.out.println(array[1]); // Prints foo
如果你真的想要81个独立的BitSet
对象,你需要创建81个不同的BitSet
对象:
for (int ligne = 0; ligne < 9; ligne++) {
for (int colonne = 0; colonne < 9; colonne++) {
BitSet bitSet = new BitSet();
bitSet.set(1, 10);
solveur[ligne][colonne] = bitSet;
}
}
理解为什么会这样非常重要 - 这基本上是理解 Java 中引用和对象之间的区别的问题,值得花一些时间时间确保你清楚它......它几乎影响 你在 Java 所做的一切。
那是因为 Java 使用了对象引用。
solveur[ligne][colonne] = BitInitialisation;
在这里,您已在所有 81 个单元格中分配了对 BitInitialisation
的引用。修改其中任何一个都会修改同一个对象。我可以提出两个解决方案:
- 您可以在内循环的每次迭代中创建新的
BitSet
。 (@JonSkeet 的回答涵盖了这一点。) 您可以在
BitSet
对象上调用.clone()
方法。solveur[ligne][colonne] = BitInitialisation.clone();