Java, чтобы определить, является ли массив подмножеством другого

#java

#java

Вопрос:

У меня возникли проблемы с выяснением, находится ли определенное количество чисел в другом массиве.Первый массив генерирует 10 случайных чисел, а во втором массиве пользователь угадывает 5 чисел.Я пытаюсь выяснить, угадал ли пользователь какие-либо последовательности.Я использовал циклы for, чтобы выяснить, есть ли числа пользовательского ввода в любом из чисел из 1-5 в массиве 10, если нет, то будут проверены числа 2-6 и так далее. Например, если в программе были следующие выигрышные номера: 23 56 67 06 43 22 59 24 90 66 и пользователь ввел: 01 06 43 22 89. Я продолжаю выводить индекс за пределы.Как мне это исправить?

     // to check if user guessed a sequence
    
    boolean guessed = false;
    int counter = 0;
    int i , j = 0;
    
    for (i = 4; i < numbers.length; i  ) {    // users numbers
        
        for ( j = 4; j < lottery.length; j  ) {  // first 5 numbers from array 
            
            if ( lottery[i] == numbers[j]) {
                break;
            }
            if ( j == i) {
                guessed = true;
            }
        }
    }
 

Комментарии:

1. есть какая-нибудь причина, по которой вы начинаете цикл с 4?

2. Вы имеете в виду, что всегда три числа должны быть последовательно в обоих массивах?

3. Итак, в основном я хочу проверить, угадал ли пользователь 2,3, 4 или все номера (в том же порядке) лотерейного массива

4. Я начал цикл с 4, потому что хочу проверить, соответствуют ли номера пользователей первым 5 номерам в массиве лотереи, я все время получаю индекс из привязки

5. Вы поменяли местами свои индексы. Ваш внешний цикл проверяет i < numbers.length , поэтому вам следует обратить numbers[i] внимание. Аналогично, ваш внутренний цикл проверяет j < lottery.length , поэтому вам следует обратить lottery[j] внимание.

Ответ №1:

Похоже, что String::indexOf в этой задаче должен быть реализован метод, аналогичный для массивов, пытающихся найти индекс подмассива int indexOf(int[] search, int[] input) .

Кроме того, может потребоваться поиск всех возможных подмассивов search подмассива ( lottery ). Таким образом, упомянутый метод следует расширить для поиска поддиапазона search аргумента: int indexOf(int[] search, int[] input)

Простая реализация будет:

 static int indexOf(int search[], int from, int to, int[] input) {
    if (null == search || null == input || search.length > input.length) {
        return -1;
    }
    
    for (int i = 0, n = input.length - (to - from); i <= n; i  ) {
        boolean found = true;
        for (int j = from; found amp;amp; j < to; j  ) {
            if (input[i   j - from] != search[j]) {
                found = false;
            }
        }
        if (found) {
            return i;
        }
    }
    return -1;
}
 

Ширина и соответствующие индексы from / to поддиапазонов поиска могут быть сгенерированы следующим образом (от всей длины lottery до 2):

 int[] numbers = {23, 56, 67, 06, 43, 22, 59, 24, 90, 66};
int[] lottery = {01, 06, 43, 22, 89};

for (int n = lottery.length; n > 1; n--) {
    for (int m = 0; m <= lottery.length - n; m  ) {
        int ix = indexOf(lottery, m, m   n, numbers);
        if (ix > -1) {
            System.out.printf("Found subarray %s, width=%d from: %d to %d ",
                    Arrays.toString(Arrays.copyOfRange(lottery, m, m   n)), n, m, m   n - 1);
            System.out.printf("at index: %d%n", ix);
        }
    }
}
 

Выходной сигнал

 Found subarray [6, 43, 22], width=3 from: 1 to 3 at index: 3
Found subarray [6, 43], width=2 from: 1 to 2 at index: 3
Found subarray [43, 22], width=2 from: 2 to 3 at index: 4
 

Более эффективная реализация будет использовать алгоритм Кнута — Морриса — Пратта для обхода повторяющихся проверок одних и тех же значений во входном массиве.

Комментарии:

1. Где и как вы пытаетесь его создать? Это просто метод, который должен быть вызван из статического main метода, как показано в этой демонстрации