Проблема с переключателем лампы Java - PullRequest
0 голосов
/ 05 июля 2011

У меня есть список массивов, содержащий 5 лампочек.Я могу перебирать их так:

for(Bulb bul : list){
    System.out.println(bul.id);
}

Лампа не выключена / не включена.Эффект в том, что его соседние лампочки тоже переключаются.

Моя проблема в том, что при включении последней или четвертой лампочки мне нужно определить ее соседей.Так как у меня есть 5 лампочек, это будет работать.

int bulbIdClicked = 3;

if(bul.id == (bulbIdClicked + 1)%5)

if(bul.id == (bulbIdClicked - 1)%5)

Для 3 это даст мне 2 и 4 как соседей.Но когда 4 переключается, это дает мне 3 и 0 и соседей, где 0 должно быть 5.

Как я могу решить эту проблему?

Ответы [ 6 ]

2 голосов
/ 05 июля 2011

Если оно должно перейти от 0 до 5, вы должны использовать %6

1 голос
/ 05 июля 2011

Если у вас есть идентификатор лампочки в диапазоне от 0 до 4, лучший способ получить следующий и предыдущий идентификаторы - использовать:

next = (id + 1) % 5
prev = (id + 4) % 5

Это не зависит от языка, поскольку не все языки обрабатывают операторы модулей для отрицательных чисел одинаково. Вы можете видеть, что шаг вперед 4 из 4 (например) дает вам: 0, 1, 2, 3, что равно шагу назад.

Тем не менее. модуль действительно работает только с нулевыми значениями. Поскольку у вас есть однозначные значения, вы можете сначала вычесть одно, сделать соответствующее сложение / по модулю, а затем снова добавить одно.

next = ((id - 1) + 1) % 5 + 1
prev = ((id - 1) + 4) % 5 + 1

Это упрощает до:

next = id % 5 + 1
prev = (id + 3) % 5 + 1

Используя эту формулу, вы получите:

id  next  prev
--  ----  ----
 1    2     5
 2    3     1
 3    4     2
 4    5     3
 5    1     4

как и ожидалось.

Это примерно настолько же оптимизировано, насколько вы, вероятно, получите без справочной таблицы. Вы можете использовать тот же подход для любого размера переворачивания (не только 5), вам просто нужно изменить модуль и то, что вы добавляете.

Если индексы варьируются от 1 до N, то это:

next = id % [N] + 1
prev = (id + [N-2]) % [N] + 1

где цифры внутри [] являются постоянными в зависимости от количества индексов.

0 голосов
/ 05 июля 2011

Если вам нужно перемещаться по списку вперед и назад, используйте ListIterator (доступно через методы list.listIterator() или list.listIterator(index). Вот пример кода:

List<Bulb> bulbs = new ArrayList<Bulb>();
int amount = 500;
for(int i = 0; i < amount; i++){bulbs.add(new Bulb());}
// which one to switch off
int offset = new Random().nextInt(amount);
ListIterator<Bulb> li = bulbs.listIterator(offset);
li.next().switchOff();
if(li.hasNext()){
    li.next().switchOff();
    // go back to selected offset
    li.previous();
}
if(li.hasPrevious()){
    li.previous().switchOff();
}
0 голосов
/ 05 июля 2011

Проверьте, последняя ли лампочка. У последней лампочки будет только левый сосед

if(bul.id == numBulbs)
{
   //Check only left side
   if(bul.id == (bulbIdClicked - 1)%5)
   ...
}

Вы должны сделать то же самое для первой лампы

if(bul.id == 0)
{
   //Check only right side
   if(bul.id == (bulbIdClicked + 1)%5)
   ...
}
0 голосов
/ 05 июля 2011

Используя 0..4 в качестве идентификатора лампы вместо 1..5.Фактически это основная причина, по которой программисты предпочитают подсчет с нуля: это упрощает индексирование.

0 голосов
/ 05 июля 2011

индекс массива начинается с 0, поэтому, если у вас есть 5 элементов, то они находятся в позиции 0,1,2,3,4 ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...