Как правило, такую функцию могут реализовать друзья, имеющие некоторый опыт разработки, но это всего лишь вопрос эффективности. Когда мы обычно сталкиваемся с такой проблемой, мы всегда думаем о ней в плоском порядке. Сначала генерируем массив, а затем в цикле добавляем в него случайные числа. В процессе добавления чисел сначала проверяем, существуют ли они в массиве. . Если этого числа не существует, оно будет добавлено непосредственно в массив, если оно существует, то оно не будет добавлено. Обычно мы думаем о проблемах таким образом, и, думая таким образом, можно достичь определенных функций. Как я только что сказал, это всего лишь вопрос эффективности.
Чтобы лучше понять смысл этого вопроса, давайте сначала посмотрим на конкретное содержание: сгенерировать случайный массив 1-100, но числа в массиве не могут повторяться, то есть позиция случайная, но элементы массива невозможно повторить. Здесь длина массива для нас не указана, мы можем позволить ей быть любой длиной от 1 до 100.
Далее давайте посмотрим, как его лучше реализовать. Обычно для его реализации мы используем ArrayList, как показано в следующем коде:
Скопируйте код кода следующим образом:
пакет cn.sunzn.randomnumber;
импортировать java.util.ArrayList;
импортировать java.util.Random;
публичный класс Демо {
public static void main(String[] args) {
Значения Object[] = новый Object[20];
Случайный случайный = новый случайный();
Список ArrayList<Integer> = новый ArrayList<Integer>();
for (int i = 0; i <values.length; i++) {
целое число = random.nextInt(100) + 1;
если (!list.contains(число)) {
список.добавить(номер);
}
}
значения = list.toArray();
/************ Обход массива и вывод данных *************/
for (int i = 0; i <values.length; i++) {
System.out.print(значения[i] + "/t");
если ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
Вышеописанный процесс реализации относительно неэффективен. Поскольку каждый раз, когда вы добавляете его, вам нужно проверить, существует ли это число в текущем списке, временная сложность равна O(N^2). Мы можем думать об этом так: поскольку здесь нет дублирования, мы можем подумать о функциях HashSet и HashMap. HashSet реализует интерфейс Set. Математическое определение Set — это коллекция без дублирования и порядка. HashMap реализует Map и не допускает дублирования ключей. Таким образом, мы можем использовать HashMap или HashSet для достижения этой цели.
При использовании HashMap для его реализации вам нужно всего лишь преобразовать его ключ в массив. Код выглядит следующим образом:
Скопируйте код кода следующим образом:
пакет cn.sunzn.randomnumber;
импортировать java.util.HashMap;
импортировать java.util.Random;
публичный класс Демо {
public static void main(String[] args) {
Значения Object[] = новый Object[20];
Случайный случайный = новый случайный();
HashMap<Object, Object> hashMap = новый HashMap<Object, Object>();
/******* Генерируем случайные числа и сохраняем их в HashMap *******/
for (int i = 0; i <values.length; i++) {
целое число = random.nextInt(100) + 1;
hashMap.put(число, я);
}
/************ Импортировать массив из HashMap************/
значения = hashMap.keySet().toArray();
/*********** Обход массива и вывод данных *************/
for (int i = 0; i <values.length; i++) {
System.out.print(значения[i] + "/t");
если ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
Поскольку связь между HashSet и HashMap слишком тесная, HashSet реализуется с использованием HashMap на нижнем уровне. Однако здесь нет коллекции значений, есть только коллекция ключей, поэтому ее также можно реализовать с помощью HashSet. Код выглядит следующим образом. :
Скопируйте код кода следующим образом:
пакет cn.sunzn.randomnumber;
импортировать java.util.HashSet;
импортировать java.util.Random;
публичный класс Демо {
public static void main(String[] args) {
Случайный случайный = новый случайный();
Значения Object[] = новый Object[20];
HashSet<Integer> hashSet = новый HashSet<Integer>();
/******* Генерируем случайные числа и сохраняем их в HashSet *******/
for (int i = 0; i <values.length; i++) {
целое число = random.nextInt(100) + 1;
hashSet.add(число);
}
значения = hashSet.toArray();
/*************** Обход массива и вывод данных **********/
for (int i = 0; i <values.length; i++) {
System.out.print(значения[i] + "/t");
если ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}
Эта реализация немного более эффективна. Если мы ограничим длину массива, нам нужно будет только изменить цикл for и установить его на цикл wlie. Как показано ниже:
Скопируйте код кода следующим образом:
пакет cn.sunzn.randomnumber;
импортировать java.util.HashSet;
импортировать java.util.Random;
публичный класс Демо {
public static void main(String[] args) {
Случайный случайный = новый случайный();
Значения Object[] = новый Object[20];
HashSet<Integer> hashSet = новый HashSet<Integer>();
/****** Генерируем случайные числа и сохраняем их в HashSet ******/
while (hashSet.size() <values.length) {
hashSet.add(random.nextInt(100) + 1);
}
значения = hashSet.toArray();
/************ Обход массива и вывод данных *************/
for (int i = 0; i <values.length; i++) {
System.out.print(значения[i] + "/t");
если ((i + 1) % 10 == 0) {
System.out.println("/n");
}
}
}
}