有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用位集方法处理位集类型表?

我必须创建一个具有两个类型位集维度(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);
    }   
}

结果:空表


共 (2) 个答案

  1. # 1 楼答案

    您已经创建了一个包含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中所做的一切

  2. # 2 楼答案

    这是因为Java使用对象引用

    solveur[ligne][colonne] = BitInitialisation;
    

    在这里,您已经在所有81个单元格中分配了对BitInitialisation的引用。修改其中任何一项都将修改同一对象。我可以提出两个解决方案:

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

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