Вывести неповторяющиеся записи из таблицы умножения
Я начал изучать Java. Наткнулся в интернете на задачу:
Для проверки остаточных знаний учеников после летних каникул, учитель младших классов решил начинать каждый урок с того, чтобы задавать каждому ученику пример из таблицы умножения, но в классе 15 человек, а примеры среди них не должны повторяться. В помощь учителю напишите программу, которая будет выводить на экран 15 случайных примеров из таблицы умножения (от 2×2 до 9×9, потому что задания по умножению на 1 и на 10 — слишком просты). При этом среди 15 примеров не должно быть повторяющихся (примеры 2×3 и 3×2 и им подобные пары считать повторяющимися).
Моё решение такое:
import java.util.Arrays;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
String[] tasksArray = tasksArray();
for (int i = 0; i < 15; i++) {
System.out.println(tasksArray[i]);
}
}
public static String[] tasksArray() {
String[] tasksArray = new String[36];
int n = 0;
for (int i = 2; i <= 9; i++) {
for (int j = i; j <= 9; j++) {
tasksArray[n] = i + " × " + j + " = ?";
n++;
}
}
Collections.shuffle(Arrays.asList(tasksArray));
return tasksArray;
}
}
Я так и не додумался самостоятельно, как перемешивать массив. Но зато узнал о Collections.shuffle. Мой вопрос: как бы решили такую задачи опытные программисты? Интересует сам подход.
Ответы (1 шт):
попробуй так:
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;
public class Main {
public static void main(String[] args) {
int min = 2;
int max = 9;
int size = 15;
Set<String> set = new HashSet<>();
while (set.size() < size + 1) {
// generate first element
int first = ThreadLocalRandom.current().nextInt(min, max + 1);
// generate second element
int second = ThreadLocalRandom.current().nextInt(min, max + 1);
// validate first*second and second*first
if (!set.contains(first + " * " + second) && (!set.contains(second + " * " + first))) {
set.add(first + " * " + second);
}
}
}
}