Номера не дублируются в пользовательском вводе - PullRequest
0 голосов
/ 05 марта 2020

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

Этот метод находится в моем классе Player

public void choose() {
        int temp = 0;

        for (int i = 0; i<6; i++) {
            System.out.println("Enter enter a number between 1 & 59");
            temp = keyboard.nextInt();
            keyboard.nextLine();
            while ((temp<1) || (temp>59)) {
                System.out.println("You entered an invalid number, please enter a number between 1 and 59");
                temp = keyboard.nextInt();
                keyboard.nextLine();
            }

            if (i > 0) {
                while(temp == numbers[i-1]) {
                    System.out.println("Please enter a different number as you have already entered this");
                    temp = keyboard.nextInt();
                    keyboard.nextLine();
                }
            }
            numbers[i] = temp;
        }
    }

Ответы [ 5 ]

2 голосов
/ 05 марта 2020

Сделайте это следующим образом:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int[] numbers = new int[6];
    static Scanner keyboard = new Scanner(System.in);

    public static void main(String args[]) {
        // Test
        choose();
        System.out.println(Arrays.toString(numbers));
    }

    static void choose() {
        int temp;
        boolean valid;
        for (int i = 0; i < 6; i++) {
            // Check if the integer is in the range of 1 to 59
            do {
                valid = true;
                System.out.print("Enter in an integer (from 1 to 59): ");
                temp = keyboard.nextInt();
                if (temp < 1 || temp > 59) {
                    System.out.println("Error: Invalid integer.");
                    valid = false;
                }
                for (int j = 0; j < i; j++) {
                    if (numbers[j] == temp) {
                        System.out.println("Please enter a different number as you have already entered this");
                        valid = false;
                        break;
                    }
                }
                numbers[i] = temp;
            } while (!valid); // Loop back if the integer is not in the range of 1 to 100
        }
    }
}

Пробный прогон:

Enter in an integer (from 1 to 59): 100
Error: Invalid integer.
Enter in an integer (from 1 to 59): -1
Error: Invalid integer.
Enter in an integer (from 1 to 59): 20
Enter in an integer (from 1 to 59): 0
Error: Invalid integer.
Enter in an integer (from 1 to 59): 4
Enter in an integer (from 1 to 59): 5
Enter in an integer (from 1 to 59): 20
Please enter a different number as you have already entered this
Enter in an integer (from 1 to 59): 25
Enter in an integer (from 1 to 59): 6
Enter in an integer (from 1 to 59): 23
[20, 4, 5, 25, 6, 23]
1 голос
/ 05 марта 2020

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

Если вы не знакомы с рекурсивными методами, это в основном метод, который вызывает себя внутри метода. Используя умные параметры, вы можете использовать рекурсивный метод как al oop. Например,

void loop(int index) {

   if(index == 10) {
       return;   //End loop
   } 
   System.out.println(index);
   loop(index++);
}

путем вызова loop(1) будут напечатаны цифры от 1 до 9.

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

public void choose(int nbrOfchoices, List<Integer> taken) {
      if(nbrOfChoices < 0) {
          return; //Terminate the recursively loop
      }

      System.out.println("Enter enter a number between 1 and 59");

      try {      
          int temp = keyboard.nextInt(); //Scanner.nextInt throws InputMismatchException if the next token does not matches the Integer regular expression
      } catch(InputMismatchException e) {
          System.out.println("You need to enter an integer");
          choose(nbrOfChoices, taken);
          return;
      }
      if (value < 1 || value >= 59) { //Number not in interval
            System.out.println("The number " + temp + " is not between 1 and 59.");
            choose(nbrOfChoices, taken);
            return;
        }

        if (taken.contains(temp)) { //Number already taken
            System.out.println("The number " + temp + " has already been entered.");
            choose(nbrOfChoices, taken);
            return;
        }
        taken.add(temp);
        choose(nbrOfChoices--, taken);
}

Теперь вы запускаете рекурсивный метод, вызывая select (yourNumberOfchoices, yourArrayList selected). Вы также можете легко добавить два дополнительных параметра, если хотите изменить интервал между номерами.

1 голос
/ 05 марта 2020

Для проверки значения, присутствующего в массиве чисел, используйте Arrays.asList(numbers).contains(temp)

Может быть лучше, если вы используете ArrayList для хранения чисел.

0 голосов
/ 05 марта 2020

Я надеюсь, что это поможет, upvote, если да

import java.util.ArrayList;
import java.util.Scanner;
public class Test {
private ArrayList<String> choose() {
Scanner scanner = new Scanner(System.in);
ArrayList<String> alreadyEntered = new ArrayList<>(6); // using six because your loop indicated me that you're taking six digits 
for(int i = 0 ; i < 6 ; ++i){ // ++i is more efficient than i++
    System.out.println("Enter a number between 1 & 59");
    String digit;
    digit = scanner.nextLine().trim();
    if(digit.matches("[1-5][0-9]|[0-9]" && !alreadyEntered.contains(digit))// it checks if it is a number as well as if it is in range as well if it is not already entered, to understand this learn about regular expressions
    alreadyEntered.add(digit);
    else {
      System.out.println("Invalid input, try again");
      --i;
    }
 }
 return alreadyEntered // return or do whatever with the numbers as i am using return type in method definition i am returning
}

 scanner.close();
 } 

, использующий массив строк, просто чтобы упростить задачу, в противном случае мне понадобится какой-то анализ от целого числа до строки и от строки до целого числа

0 голосов
/ 05 марта 2020

То, что вы хотите сделать, это использовать рекурсию, чтобы вы могли попросить их снова ввести данные. Вы можете определить варианты вместо 6. Вы можете определить maxExclusive вместо 59 (60 в данном случае). Вы можете отслеживать выбранные в качестве набора целочисленных значений, поскольку наборы могут содержать только уникальные ненулевые значения. В конце каждого вызова выбора, который мы вызываем, выберите выбор снова, оставив на 1 меньше выбора вместо a для l oop. В начале каждого вызова метода мы проверяем, является ли выбор <0, если это так, мы предотвращаем выполнение. </p>

    public void choose(Scanner keyboard, int choices, int maxExclusive, Set<Integer> chosen) {
        if (choices <= 0) {
            return;
        }
        System.out.println("Enter enter a number between 1 & " + (maxExclusive - 1));

        int value = keyboard.nextInt();

        keyboard.nextLine();

        if (value < 1 || value >= maxExclusive) {
            System.out.println("You entered an invalid number.");
            choose(keyboard, choices, maxExclusive, chosen);
            return;
        }

        if (chosen.contains(value)) {
            System.out.println("You already entered this number.");
            choose(keyboard, choices, maxExclusive, chosen);
            return;
        }
        chosen.add(value);
        choose(keyboard, --choices, maxExclusive, chosen);
    }

choose(new Scanner(System.in), 6, 60, new HashSet<>());
...