2014-11-05 4 views
1

Для моего кода я хотел бы проверить массив, который будет заполняться много раз с помощью 6 случайных целых чисел. Каждый раз, когда я хочу проверить, различаются ли все 6 значений, и если это происходит для остановки кода. Однако после попытки использования циклов у меня возникли проблемы, поэтому я просто использовал длинную задницу If, чтобы проверить каждое местоположение в массиве друг с другом. Однако это не работает. Хотел бы, чтобы кто-нибудь мог сказать мне, почему я глуп.Проверьте, не равны ли все значения в массиве (java)

if((diceArray[0] != diceArray[1] & diceArray[0]!=diceArray[2] & diceArray[0]!=diceArray[3] & diceArray[0]!=diceArray[4] & diceArray[0]!=diceArray[5] & diceArray[1]!=diceArray[2] & diceArray[1]!=diceArray[3] & diceArray[1]!=diceArray[4] & diceArray[1]!=diceArray[5] & diceArray[2]!=diceArray[3] & diceArray[2]!=diceArray[4] & diceArray[2]!=diceArray[5] & diceArray[3]!=diceArray[4] & diceArray[3]!=diceArray[5] & diceArray[4]!=diceArray[5])) 

       { 
        System.out.println("stop babes"); 
       } 
       else 
       { 
        System.out.print("Did not work"); 
       } 

Этот код еще больше чем, но я знаю, что все остальное работает, когда я распечатываю каждую последовательность, все они не имеют проблем. Когда я запускаю код с этой частью В идеале, он будет печатать много последовательностей с дублирующимся номером, и с этими распечатками «не работает», и один из результатов должен появиться с «stop babes» (они будут удалены позже, просто используя их для проверки и возврата используется для остановки код) Однако, когда я запускаю код это происходит

how many rolls of 6 dice? 3 
LINE 1 
4 1 3 5 5 5 
stop babes 
LINE 2 
4 4 1 2 6 1 
stop babes 
LINE 3 
3 6 4 6 4 4 
stop babes 

JUST быстро редактировать повторно на, если заявление. Я понимаю, что это может быть сокращено до быстрой петли. Я просто хотел переборщить эту проблему. Основная проблема заключается в том, что текст «stop babes» должен печататься только тогда, когда печатается код, такой как 1 2 3 4 5 6, информирующий меня, что код работает и позволяет мне вставить оператор break в основной цикл FOR.

+0

И оператор is && – aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

+4

Несмотря на все ответы и комментарии до сих пор, '&' является допустимым логическим/логическим оператором; он просто не замыкается, как '&&'. – GriffeyDog

+0

У меня был && ранее, но он был изменен при устранении неполадок. Не работает – RemoteCntrol

ответ

0

Если ваша конечная цель состоит в том, чтобы удалить последовательности, которые имеют дубликаты, вы должны рассмотреть возможность проверить массив в то время вы заполняете его:

Вместо того, чтобы просто делать что-то вроде этого (вы не предоставили код так Я просто предполагаю,):

n = rand.nextInt(); 
diceArray[nextPosition++] = n; 

ли что-то вроде:

n = rand.nextInt(); 
for (int i = 0; i < nextPosition; i++) { 
    if (diceArray[i] == n) { 
     return; // Or whatever will cause the array to be disqualified. 
    } 
} 

Таким образом, вы избавите себя прокатные цифры, которые вы не будете использовать в любом случае. Предположим, вы свернули 2 2. Вы уже знаете, что вам нужно дисквалифицировать этот массив, вам не нужно продолжать кататься, чтобы добраться до 2 2 1 3 4 5, а затем пропустить все это и дисквалифицировать его в конце.

Это также верно, если вы хотите подсчитать количество плохих массивов, которые вы получили до того, как попали в хороший массив.

Random rand = new Random(); 
    int[] diceArray = new int[6]; 

    int badArrays = 0; 
    int nextPosition = 0; 

    while (nextPosition < 6) { 

     boolean goodMove = true; 
     int n = rand.nextInt(6) + 1; 
     for (int i = 0; i < nextPosition; i++) { 
      if (diceArray[i] == n) { 
       goodMove = false; 
       break; 
      } 
     } 
     if (goodMove) { 
      diceArray[nextPosition++] = n; 
     } else { 
      nextPosition = 0; 
      badArrays++; 
     } 
    } 

    System.out.println("Got the array: " + Arrays.toString(diceArray) 
         + " after " + badArrays + " failures."); 
+0

На самом деле цель состоит в том, чтобы подсчитать, сколько раз это чтобы получить последовательность без каких-либо дубликатов. – RemoteCntrol

+0

Отлично, он работает и для этого. Я отредактировал свой ответ, чтобы показать вам код для подсчета количества дубликатов массивов, фактически не заполняя их полностью. – RealSkeptic

+0

Ты чемпион мой друг! Это отлично работает для меня. Очень похоже на то, что я делал, но гораздо проще работать. Легко адаптировать его к тому, что мне нужно. Также как я могу ответить на вопрос? Я новичок: D – RemoteCntrol

0

Рассмотрите возможность использования для цикла, чтобы сделать это вместо того гиганта, если заявление:

for (int i = 0; i < 6; i++) 
{ 
    for (int j = i + 1; j < 6; j++) 
    { 
     if (diceArray[i] == diceArray[j]) 
      System.out.println("Did not work!"); 
    }  
} 

Кроме того, лучше использовать оператор && для логического элемента И, а не &, потому что && короткого замыкания - это будет останавливаться и возвращать значение false в первой части условия, которое вычисляется как false, тогда как & будет вычислять все условия, чтобы они были менее эффективными.

+3

Оба являются логическими и. Ваше утверждение неверно. – Turing85

+1

Я достаточно уверен, что 'diceArray [0] == diceArray [0]' будет первой итерацией внутреннего looop. – clcto

+0

Вы правы, я только что исправил это. –

-2

Я считаю, что вы хотите & & против &

Одна операция поразрядного в то время как другой логический.

+3

Это неверно. В boolean-context, & является «нормальным», а while - «быстрым» и «ломается», если одно выражение «ложно». – Turing85

+0

Не знаю, где я ошибался, так как даже документы Java показывают один как поразрядный, а другой логичен. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Wranorn

+0

"* один как поразрядный, а другой логический *", но оба они представляют собой оператор И. Для аргументов * boolean * используется короткое замыкание (&&), другое - нет (&). – Pshemo

1

Это должно работать для вас:

public static bool areValuesUnique(int[] values) 
{ 
    for(int i = 0; i < values.length; ++i) 
    { 
     for(int j = i + 1; j < values.length; ++j) 
     { 
      if(values[i] == values[j]) 
       return false; 
     } 
    } 
    return true; 
} 

И вы бы использовать его как так и имеет дополнительное преимущество в работе с массивом любого размера.

if(areValuesUnique(diceArray)) 
{ 

} 
else 
{ 

} 
1

Я думаю, вам нужно использовать Set для проверки наличия в массиве любых объектов равных. Вы просто создаете новый HashSet с объектами, содержащимися в массиве, и после этого проверяете длину созданного набора. Если длина равна длине вашего массива, все объекты разные.

Set<YOUR_ARRAY_TYPE> set = new HashSet<YOUR_ARRAY_TYPE>(); 
set.addAll(Arrays.asList(YOUR_ARRAY)); 
if (set.size() == YOUR_ARRAY.length) 
{ 
    ... 
} 
else 
{ 
    ... 
} 
+0

Использование наборов - это как взять кувалду, чтобы расколоть орех. – Turing85

+0

@ Turing85 Вы, конечно, имеете право на свое мнение. Но в ситуациях, когда производительность не является критичной, использование свойств такого набора может привести к тому, что код легко читается и поддерживается. Код в этом ответе явно правильный (хотя и более подробный, чем необходимо); контрастировать с решениями, использующими петли «для», для которых требуется более тщательная проверка. – dnault

+0

Я никогда не говорил, что код неверен, но для этой цели (это упражнение для кого-то, кто пытается изучить Java) слишком много. И читаемость - вопрос мнения :) – Turing85

0

Другой способ, любопытное развлечение, использование битовой маскировки. Так мы катались в старые времена.

// watch out: only works for dice values 0-30 
public static boolean areDiceUnique(int[] diceArray) { 
    int mask=0; 
    for(int i=0; i<diceArray.length; i++) { 
    int orMask = 1<<diceArray[i]; 
    if((mask & orMask) != 0) 
     return false; 
    mask |= orMask; 
    } 
    return true; 
} 

, если вы просто ищете уникальные кости валков только, а затем просто начать с List<Integer> с 1,2,3,4,5,6 и while(list.size()>0) получить деталь на rand.nextInt(list.size()).

+0

См. Также: http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html – dnault

Смежные вопросы