Здесь у меня есть переключатель случая Java, где я сравниваю 2 случайно сгенерированных массива целых чисел из 7 чисел, массив lottery1 создается раньше в зависимости от ввода пользователя. Проблема в том, что мне нужно ...

1
Aker 15 Янв 2021 в 19:40

3 ответа

Лучший ответ

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

    int[] matching = new int[7];
    int[] lottery1 = new int[7];
    int[] lottery2 = new int[7];

    // Generate random numbers
    for (int i = 0; i < 7; i++) {
        lottery1[i] = (int) (Math.random() * 52.0);
        lottery2[i] = (int) (Math.random() * 52.0);
    }

    // Compare and store matching numbers in matching array;
    // The nested loop below will compare the every element of the both lists
    // together and store the
    // results in matching array
    int matchingCount = 0;
    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            if (lottery1[i] == lottery2[j]) {
                matching[matchingCount++] = lottery1[i];
            }
        }
    }

    System.out.print("Matching Count: " + matchingCount + "\nMatch Numbers: [ ");
    for (int i = 0; i < matchingCount; i++)
        System.out.print(matching[i] + " ");
    System.out.println("]");
2
Daniel 15 Янв 2021 в 17:06

int[] similar = new int[7]; //I'm trying to put the matching numbers into this new array

lottery1[i] = similar[j];

similar - это массив размера 7, заполненный семью нулевыми значениями (поскольку массивы вначале обнуляются). Вы никогда ничего не вписываете в подобное. Вы перезаписываете lottery1 чем-то похожим. Другими словами, этот код - тупой способ выполнить:

lottery1[i] = 0;

Что, конечно, не то, что вы хотели. Вы также инициализируете similar размером 7, но это неверно: кто знает, сколько вообще существует подобных чисел?

У вас есть 4 варианта:

  1. Используйте List<Integer> list = new ArrayList<Integer>(); - в отличие от массивов, для массивов не требуется предварительно заданный размер, вы можете просто вызвать list.add(), и список позаботится об этом. Это переменный размер.

  2. Сделайте петлю дважды; один раз, чтобы определить, сколько совпадений, затем вы можете создать массив similar нужного размера, а затем второй раз заполнить его.

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

  4. Создайте массив similar размером 7 и используйте специальное контрольное значение (например, -1), чтобы указать, что это не должно отображаться / печататься.

Кроме того, ваш код содержит ошибки: если у вас есть репликации, вы переоцениваете. Представьте, что лотерея 1 - это [1,2,3,4,5,6,1], а лотерея2 - [1,2,2,3,4,1,6], ваш алгоритм скажет, что существует 6 совпадений, что не соответствует действительности. t звучит правильно (первая «1» соответствует дважды, вторая «1» соответствует дважды, а 2 - 2. Вам придется подумать о том, как вы хотите решить эту проблему.

Подумайте об этом и запишите несколько примеров входных данных + пример выходных данных, который вам нужен, а затем подумайте, как написать код, который делает это. Не просто ныряйте.

2
rzwitserloot 15 Янв 2021 в 17:24

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

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

Затем создаются два массива, и вторая подзадача - найти соответствие между ними.

Пример реализации с использованием Stream API может быть следующим:

  1. Сгенерировать массив случайных целых чисел:
static int[] getRandomArray() {
    return getRandomArray(7, 52);
}

static int[] getRandomArray(int k, int n) {
    int[] result = new SecureRandom().ints(1, n + 1) // n + 1 to ensure N can be included
                                     .distinct() // make sure all elements are different
                                     .limit(k)   // pick K numbers
                                     // .sorted() // sort the array if needed
                                     .toArray();
    System.out.println("Random array: " + Arrays.toString(result));
    return result;
}
  1. Сопоставьте результаты с помощью Set:
static int[] findMatch(int[] lotteryPick, int[] lotteryGuess) {
    Set<Integer> set = Arrays.stream(lotteryPick).boxed().collect(Collectors.toSet());
    int[] match = Arrays.stream(lotteryGuess).filter(x -> set.contains(x)).toArray();

    if (match.length == 0) {
        System.out.println("No matched numbers found");
    } else {
        String num = match.length == 1 ? " number" : " numbers";
        System.out.println("Matched: " + match.length + num + ", the match: " + Arrays.toString(match));
    }
    System.out.println("-------------------------------");

    return match;
}

Тогда тесты выглядели бы так просто:

int t = 5;
while (t--> 0) {
    findMatch(getRandomArray(), getRandomArray());
}

Возможный выход:

Random array: [26, 33, 29, 23, 49, 1, 14]
Random array: [37, 3, 27, 29, 34, 24, 36]
Matched: 1 number, the match: [29]
-------------------------------
Random array: [9, 4, 32, 27, 29, 18, 35]
Random array: [34, 2, 23, 29, 27, 6, 30]
Matched: 2 numbers, the match: [29, 27]
-------------------------------
Random array: [35, 18, 4, 42, 19, 6, 13]
Random array: [30, 8, 4, 37, 31, 9, 46]
Matched: 1 number, the match: [4]
-------------------------------
Random array: [52, 7, 47, 22, 12, 9, 26]
Random array: [46, 13, 20, 17, 1, 4, 34]
No matched numbers found
-------------------------------
Random array: [31, 40, 9, 3, 2, 49, 44]
Random array: [2, 15, 13, 36, 10, 43, 12]
Matched: 1 number, the match: [2]
-------------------------------
0
Alex Rudenko 15 Янв 2021 в 18:01
65740043