Делайте ... пока цикл в Java

1

Может ли кто-нибудь сказать мне, что здесь происходит неправильно? Я попадаю в бесконечный цикл.

do{
    System.out.print("cards["+pickRandom+"] is:"+cards[pickRandom]);
    pickRandom = (int)(Math.random() * 52);  //pick a new random card
    System.out.print(" so now cards["+pickRandom+"] is:"+cards[pickRandom]);
    if (cards[pickRandom] != 0) {  //if it not 0, then assign it
        System.out.print("cards["+pickRandom+"] is not 0: "+cards[pickRandom]);
        shuffled[k]=cards[pickRandom];
        System.out.print(" shuffled["+k+"]:"+shuffled[k]);
        cards[pickRandom]=0;
        //System.out.println("For card "+k+ ": "+ shuffled[k] +" was found on pick number "+count);
    } 
    else{System.out.println("cards["+ pickRandom+ " was:" +cards[pickRandom]);}
}while (cards[pickRandom]==0);

Я пытаюсь выбрать случайную карту, которая не является == 0. Если это == 0, я хочу, чтобы цикл выбирал другую карту

  • 0
    Смотрите редактировать, чтобы ответить, переместите свои cards[pickRandom]=0; чтобы после цикла do-while
Теги:
do-while

2 ответа

2

Гарантируется, что ваш блок if изменит любые cards[pickRandom] которые отличны от нуля до 0. И это будет означать, что ваше условие всегда верно.

По сути, это ваша логика кода:

int x = 1;
do { 
   x = // some random value
   if (x != 0) {
      x = 0;
   }
while (x == 0);

Решение: не делайте этого. Используйте другой способ, чтобы закончить цикл. Для получения более подробной информации, пожалуйста, объясните свой код и его цели более подробно.


Возможное решение вашей проблемы: установите значение массива в ноль после цикла while:

  do {
     pickRandom = (int) (Math.random() * 52);
     if (cards[pickRandom] != 0) {
        shuffled[k] = cards[pickRandom];

        //  cards[pickRandom] = 0; // *** don't do this here ***

     } else {
        // not sure what you want here
     }
  } while (cards[pickRandom] != 0);

  cards[pickRandom] = 0;  // **** do it here! ****

Причина в том, что в этот момент вы узнаете, что выбрана правильная карта. Одна проблема - рассмотрите тестирование, чтобы убедиться, что все значения в карточках не равны 0.

Лучшее решение: используйте ArrayList из целых чисел, перетасуйте их с помощью Collections.shuffle(), а затем просто удалите 0-й элемент из цикла каждый раз, если size()> 0.

  • 0
    Да - массив массив является следующим шагом. Спасибо
1

Вы устанавливаете свои cards[pickRandom] 0 в каждом case-

cards[cards[pickRandom]=0;  

И после этого вы проверяете условие во время цикла -

while (cards[pickRandom]==0);

Таким образом, в условии while цикл всегда оценивается как true и поэтому цикл продолжается навсегда без остановки.

  • 0
    Я пытаюсь выбрать случайную карту, которая не == 0. Если это == 0, я хочу, чтобы цикл выбрал другую карту.
  • 0
    @JeffCiaccio: эта информация не скрыта в комментарии. Пожалуйста, доработайте свой вопрос, чтобы мы понимали ваши переменные и ваши цели, чтобы об этом знали все, кто читает ваш вопрос, а не только те, кто просматривает комментарии здесь.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню