[英]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
的引用。 修改任何這些都將修改同一個對象。 我可以提出兩個解決方案:
BitSet
。 (這是由@JonSkeet回答的。) 您可以在BitSet
對象上調用.clone()
方法。
solveur[ligne][colonne] = BitInitialisation.clone();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.