2015-11-09 4 views
3

Недавно я сделал быструю программу, чтобы компьютер угадал номер, который вы вводили. Я просто использовал его, чтобы показать другу пример цикла While. Я решил, что хочу сделать это более сложным, но я не уверен, как это сделать.Добавление чисел в массив каждый цикл

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

Scanner scan = new Scanner (System.in); // Number to guess // 
Random rand = new Random(); // Generates the guess // 
int GuessNum = 0, RandGuess = 0; 

System.out.println("Enter a number 1 - 100 for me to guess: "); 
int input = scan.nextInt(); 

if (input >= 1 && input <= 100) 
{ 
int MyGuess = rand.nextInt (100) + 1; 
    while (MyGuess != input) 
    { 
    MyGuess = rand.nextInt (100) + 1; 
    GuessNum++; 
    } 
    System.out.println ("I guessed the number after " + GuessNum + " tries."); 
} 
+0

Что вы не знаете, как это сделать? –

+0

Вместо массива рассмотрим набор. Такая ситуация («это значение встречается раньше») идеально подходит для этого. – CPerkins

+0

Какие усилия вы предприняли до сих пор? – samtob

ответ

6

Вы можете использовать ArrayList (динамически растущий массив)

ArrayList<Integer> list = new ArrayList<Integer>(); 

list.add(num); 

Если вы хотите увидеть, что если номер уже добавлен в ArrayList

if(list.contains(num)) 
{ 
System.out.println("You already tried " + num); 
} 

A Set также значительно лучший опция. Это то же самое, что и ArrayList, но не позволяет дублировать.

HashSet<Integer> set = new HashSet<Integer>(); 

set.add(num);//returns true if the num was not inserted before else return false 

if(!set.add(num))//set also has a contains method 
{ 
    System.out.println("You already entered " + num); 
} 
+1

'new HashSet();' и 'new ArrayList();' create raw types. Вы должны [избегать] (http://www.javapractices.com/topic/TopicAction.do?Id=224) необработанных типов. Используйте нотацию алмаза, например. 'new HashSet <>();' –

2

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

contains(...) метод, как вы узнаете, если вы уже догадались, этот номер перед

3

Массивы в Java имеют фиксированный размер. После того как вы выделили массив, добавление элементов разрешено только до количества элементов, которые вы выделили заранее. Это не будет большой проблемой в вашей ситуации, потому что значения ограничены до 100, но у вас есть лучшие альтернативы:

Библиотека Java предлагает коллекции, которые динамически растут. В вашем случае будет хорошим выбором:

  • HashSet может вырасти до любого размера, как вы идете
  • Проверка HashSet для ряда операция выполняется быстро

Другим решением было бы сделать массив из 101 boolean с:

boolean[] seen = new boolean[101]; 

Теперь вы можете проверить, если число было прежде путем тестирования seen[myGuess] будет false, и установите seen[myGuess] = true, когда вы увидите новый номер. Этот подход также очень быстрый. Тем не менее, вам нужно отслеживать, сколько доступных номеров у вас есть, потому что диапазон от 1 до 100 будет исчерпан после 100 догадок, поэтому попытка создания дополнительного номера станет бесконечным циклом.

+0

'ArrayList' не имеет фиксированного размера. –

+1

@MuratK. Что «ArrayList» связано с моим ответом? – dasblinkenlight

3

A Set является подходящим контейнером для этой функциональности. Вы бы определить так:

Set<Integer> previous = new HashSet<>(); 

А чтобы получить случайное число, которое вы ранее не пробовали

while (previous.contains(MyGuess)) 
    MyGuess = rand.nextInt(100) + 1; 
previous.add(MyGuess); 

Это позволит получить новые случайные числа от rand объекта, пока не будет установлено, что ISN» т в previous.Затем это добавляется к previous для следующей итерации.

1

Проще всего было бы добавить ArrayList и просто проверить, если список содержит случайное значение:

Ar сначала сделать и новый ArrayList:

ArrayList<Integer> myGuesses = new ArrayList(); 

Вторым шаг заключается в добавлении случайное значение в список:

ArrayList<Integer> myGuesses = new ArrayList(); 

Теперь у вас есть только, чтобы проверить, если список cotains значения bevore генерации новый и подсчета вашего TRYS:

if(myGuesses.contains(MyGuess)) 
{ 
    //your code 
} 

Я применил это к своему коду:

Scanner scan = new Scanner(System.in); // Number to guess // 
     Random rand = new Random(); // Generates the guess // 
     int GuessNum = 0, RandGuess = 0; 
     ArrayList<Integer> myGuesses = new ArrayList(); 

     System.out.println("Enter a number 1 - 100 for me to guess: "); 
     int input = scan.nextInt(); 

     if (input >= 1 && input <= 100) { 
      int MyGuess = rand.nextInt(100) + 1; 
      while (MyGuess != input) { 

       if(myGuesses.contains(MyGuess)) 
       { 
        MyGuess = rand.nextInt(100) + 1; 
        GuessNum++; 
        myGuesses.add(MyGuess); 
       } 
      } 
      System.out.println("I guessed the number after " + GuessNum + " tries."); 
     } 

Я надеюсь, что помогает!

2

Очень простой пример был бы:

public static int[] randomArray(){ 
    int number = Integer.parseInt(JOptionPane.showInputDialog("How many numbers would you like to save?: "));  //Get Number of numbers from user 
    int[] array = new int[number]; //Create the array with number of numbers (by User) 
    for(int counter = 0; counter < number; counter++){  //For loop to get a new input and output every time 
     int arrayString = (int) (Math.random() * 10); 
     array[counter] = arrayString; 
     System.out.println("Number " + (counter + 1) + " is: " + array[counter]); //Print out the number 
    } 
    return array; 
} 

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

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