2015-02-26 3 views
0

Мне нужно создать таблицу с двумя размерами битов BitSet (9x9). Я выполняю эту таблицу с битовыми значениями от 1 до 9. Я хочу вывести значение конкретного случая (пример 5), но метод .set (int, boolean) изменяет все поля в моей диаграмме.Как обрабатывать таблицу типа BitSet с помощью методов BitSet?

как это сделать ??

//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); 
    } 
} 

Результат: пустая таблица ...

+0

Цикл 'colonne' предшествующего AjusterLigne бесполезно - он просто повторяет AjusterLigne 9 раз. – laune

ответ

0

Вы создали массив 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, pr много.

+0

Darn, вы все равно на 10 секунд :) –

0

Это потому, что Java использует ссылки на объекты.

solveur[ligne][colonne] = BitInitialisation; 

Здесь вы присвоили ссылку на BitInitialisation во всех 81 клеток. Модификация любого из них изменит один и тот же объект. Я могу предложить два решения:

  1. Вы можете создать новый BitSet на каждой итерации внутреннего цикла. (На это отвечает @JonSkeet ответ.)
  2. Вы можете позвонить по методу .clone() на объект BitSet.

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