我必须创建一个具有两个类型的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);
}
}结果:空桌子..。
发布于 2015-02-26 11:24:00
您已经创建了一个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中所做的一切。
发布于 2015-02-26 11:24:10
这是因为Java使用对象引用。
solveur[ligne][colonne] = BitInitialisation;在这里,您在所有81个单元中指定了一个对BitInitialisation的引用。对其中任何一个的修改都会修改同一个对象。我可以提出两种解决办法:
BitSet。( @JonSkeet的回答涵盖了这一点。).clone()对象上调用BitSet方法。
solveur[ligne][colonne] = BitInitialisation.clone();https://stackoverflow.com/questions/28741005
复制相似问题