繁体   English   中英

如何使用BitSet方法处理BitSet类型表?

[英]How to handle BitSet type table with the BitSet methods?

我必须创建一个具有两种类型BitSet维度(9x9)的表。 我使用位值1到9来实现此表。我希望撤消特定情况的值(例如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);
    }   
}

结果:空表......

您已经创建了一个9x9的BitSet引用数组,但是将每个元素值设置为相同的引用 - 只涉及一个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的引用。 修改任何这些都将修改同一个对象。 我可以提出两个解决方案:

  1. 您可以在内循环的每次迭代中创建新的BitSet (这是由@JonSkeet回答的。)
  2. 您可以在BitSet对象上调用.clone()方法。

    solveur[ligne][colonne] = BitInitialisation.clone();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM