2016-05-11 5 views
0

Это кусок кода в Java, я пытаюсь вывести случайные числа из массива задач и убедиться, что ни один из выходов не повторяется, я помещаю их через некоторые другие циклы (скажем, у вас есть задача «шестое задание с произвольной задачей» [5] », она проходит цикл for, который будет проверять его против каждого элемента« tCheck », и хотя задача [5] равна одному из элементов tCheck, она будет продолжайте искать другой вариант, прежде чем возвращаться к началу проверки forloop ... Элементы tCheck [i] изменяются в конце каждого полного цикла вывода на новое случайное число, установленное для элемента задачи).Java - Неправильная проверка для цикла

ПРОБЛЕМА заключается в том, что, несмотря на то, что, предположительно, проверяя каждую новую случайную задачу на все элементы tCheck, иногда (не всегда) повторяются выходные задания (что означает, вместо того, чтобы выставлять слова 2,3,6,1,8,7 , 5,4, он выведет что-то вроде 2,3,2,1,8,7,5,4, где «2» повторяется ... НЕ всегда в одном и том же месте, то есть иногда это может закончиться так тоже, где «4» повторяется: 3,1,4,5,4,6,7,8)

int num = console.nextInt();         
String[] tasks = {"1","2","3","4","5","6","7","8"}; 
String[] tCheck = {"","","","","","","",""}; 
for(int i = 0; i<= (num-1); i++){ 
    int tNum = rand.nextInt(8); 
    for(int j = 0; j <=7; j++){ 
     if(tasks[tNum].equals(tCheck[j])){ 
      while(tasks[tNum].equals(tCheck[j])){ 
       tNum = rand.nextInt(8); 
      } 
      j = 0; 
     } 
    } 
    tCheck[i] = tasks[tNum]; 
    System.out.println(tasks[tNum]+" & "+tCheck[i]); 
} 

ни один из других кусков кода не влияет на эту часть (кроме настройки Random INT в , Сканеры и т. Д., Все это сделано правильно). Я просто хочу, чтобы он печатал каждый номер случайным образом и только один раз. никогда не повторять. Как мне это сделать?

Заранее спасибо.

+0

Возможный дубликат [Генерация уникальных случайных чисел в Java] (http://stackoverflow.com/questions/8115722/generating-unique-random-numbers- in-java) – SomeJavaGuy

+0

Почему вы не используете List with contains method –

+1

Почему бы вам просто не вставлять новые числа в 'HashSet' вместо всех этих циклов? Каждый раз, когда вы создаете новый, вы можете просто проверить, существует ли он в 'HashSet' в' O (1) ', и если это так, вы можете игнорировать его и генерировать новый. – Lefteris008

ответ

4

Во-первых, не используйте массивы. Используйте коллекции - они более удобны для программистов.
Во-вторых, использовать API в JDK для реализации этой идеи:

  • рандомизации порядок ваших элементов
  • затем итерацию над ними линейно

В коде:

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
tasks.forEach(System.out::println); 

работы сделанный.

+0

Это выглядит невероятно полезно; Я попытался помещать его в тестовую программу, а часть «::» не позволяет компиляции (я никогда раньше не видел такого типа форматирования, я не уверен, как это исправить). – Ray25Lee

+0

@ Ray25Lee, это просто случайный цикл, но он использует лямбда-способ записи, который был включен в 'java 8'. Если вы не используете 'java 8', вы можете просто переписать это как обычный' for (String s: tasks) .... '. – SomeJavaGuy

+0

Ницца, используя lamba для Java 8, я продолжаю забывать о них! @ Ray25Lee, проверьте свою версию Java. – AxelH

0

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

for(int i = 0; i<= (num-1); i++){ 
    int tNum = rand.nextInt(8); 
    boolean exist = Arrays.asList(tasks).contains(tNum); 
     while(!exist){ 
    //your code 
    int tNum = rand.nextInt(8); 
    exist = Arrays.asList(tasks).contains(tNum); 
    }  
} 

, если вы используете arraylist, то вы можете проверить его с contains методом, так как вы используете array мы должны получить list из массива с помощью asList(), а затем использовать метод contains. с помощью цикла while он будет продолжать генерировать random номеров до тех пор, пока он не генерирует не дублирующее значение.

+0

Это действительно дорого для больших списков. ** содержит ** циклы в списке, пока не найдет значение или не достигнет конца, это может быть очень дорого. – AxelH

0

Я использовал созданный нечто подобное с помощью ArrayList

public class Main { 
    public static void main(String[] args) { 

     String[] array = { "a", "b", "c", "d", "e" }; 
     List<String> l = new ArrayList<String>(Arrays.asList(array)); 
     Random r = new Random(); 
     while(!l.isEmpty()){ 
      String s = l.remove(r.nextInt(l.size())); 
      System.out.println(s); 
     } 
    } 
} 

я удалить случайную позицию в списке, пока он не пуст. Я не использую проверку содержимого. Я считаю, что это очень эффективно (даже если я создаю список)

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