Эта статья представит вам, как реализовать функцию случайных, без повторяющихся чисел в Java. Если вы новичок, необходимо прочитать эту статью, потому что эта функция обычно встречается во время интервью. В том числе, когда я набираю людей, я также люблю задавать другим об этом вопросе, в основном, чтобы увидеть, как рассматриваются модель и базовые знания проблемы.
Я надеюсь, что эта статья может помочь друзьям, которые связаны в первый раз, потому что я связался с некоторыми друзьями, которые либо не могут написать ее, либо использовать очень плоский образ мышления для достижения этого.
Как правило, друзья с некоторым опытом разработки могут реализовать такие функции, но это всего лишь вопрос эффективности. Когда мы сталкиваемся с такими проблемами, мы всегда думаем об этом в прямом порядке, а затем добавляем случайные числа в массив в цикле. В процессе добавления чисел сначала посмотрите, существует ли этот номер в массиве. Если этого числа не существует, он будет добавлен непосредственно в массив; Если этот номер существует, он не будет добавлен. Мы обычно рассматриваем эту проблему таким образом, и мы можем реализовать функции таким образом. Как я уже сказал, это всего лишь вопрос эффективности.
Чтобы лучше понять значение этого вопроса, давайте сначала рассмотрим конкретный контент: генерируем случайный массив 1-100, но числа в массиве не могут быть повторены, то есть позиции являются случайными, но элементы массива не могут быть повторены.
Здесь мы не указали длину массива, мы можем сделать его до 1-100.
Затем давайте посмотрим на несколько методов реализации и сравним эти методы .
Обычно мы будем использовать ArrayList или Array для его реализации. Давайте сначала рассмотрим процесс реализации ArrayList, как показано в следующем коде:
Импорт java.util.arraylist; import java.util.random;/** * Реализация с использованием arraylist * @description: * @file: demo.java * @package none * @author hanyonglu * @date 2012-10-18 06:16:55 PM * @version v1.0 */public class demo {public static static vid (vide static vid (stach Object [] values = новый объект [20]; Случайный случайный = new Random (); ArrayList <Integer> list = new ArrayList <Integer> (); for (int i = 0; i <values.length; i ++) {int number = random.nextint (100)+1; if (! list.contains (number)) {list.add (number); }} values = list.toarray (); // пройти массив и распечатать данные для (int i = 0; i <values.length; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Процесс реализации с использованием массивов выглядит следующим образом:
Import java.util.random;/** * Реализация с использованием массивов * @description: * @file: demo4.java * @package non * @author hanyonglu * @date 2012-10-18 06:27:38 PM * @version v1.0 */public demo4 {public Static void Main (string) rags) {] args). Случайный случайный = new Random (); for (int i = 0; i <values.length; i ++) {int number = random.nextint (100)+1; for (int j = 0; j <= i; j ++) {if (number! = values [j]) {values [i] = number; }}} // Траверсировать массив и распечатать данные для (int i = 0; i <values.length; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Вышеуказанные два процесса реализации относительно неэффективны. Поскольку каждый раз, когда вы добавляете, вы должны пересекать, существует ли это число в текущем списке, сложности времени o (n^2). Мы можем думать об этом таким образом: поскольку нет никакого дублирования, мы можем подумать о функциях хэшса и хэшмапа. Hashset реализует интерфейс SET, а математическое определение набора - это набор без дублирования и порядка. HashMap реализует карту, и это также ключ, который не разрешает дубликаты. Таким образом, мы можем использовать Hashmap или Hashset для его достижения.
При использовании реализации HashMap вам нужно только преобразовать его ключ в массив, и все будет в порядке, следующим образом:
Import java.util.hashmap; import java.util.iterator; import java.util.random; import java.util.map.entry;/** * Реализация с использованием hashmap * @description: * @file: demo.java * @package none * @author hanyonglu * @date: 2012-10-18 06:12:5:50. V1.0 */public class demo {public static void main (string [] args) {int n = 0; Object [] values = новый объект [20]; Случайный случайный = new Random (); HashMap <Object, Object> hashmap = new HashMap <Object, Object> (); // генерировать случайные числа и сохранить хэшмап для (int i = 0; i <values.length; i ++) {int number = random.nextint (100)+1; hashmap.put (номер, i); } // Импортные значения массива из значений hashmap = hashmap.keyset (). Toarray (); // пройти данные массива и печати для (int i = 0; i <values.length; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }} // iterator iter = hashmap.entryset (). Iterator (); // // Traversal hashmap // while (iter.hasnext ()) {// intyger <integer, integer> intry = (intpirt) iter.next (); // int key = inter.getkey (); "/t"); // // if (n % 10 == 0) {// system.out.println ("/n"); //} //}}} Поскольку взаимосвязь между Hashset и HashMap находится слишком близко, Hashset реализуется с использованием HashMap внизу, но нет никакой коллекции стоимости и только одной коллекции ключей, поэтому его также можно реализовать с использованием хэшса, следующим образом:
Импорт java.util.hashset; import java.util.random;/** * Реализация с использованием хэшсат * @description: * @file: test.java * @package none * @author hanyonglu * @date 2012-10-18 06:11:41 PM * @Version v1.0 */public Class Test {public static void void void void void main void void void void void void void void void void void void void void void void void void void. Случайный(); Object [] values = новый объект [20]; Hashset <Integer> hashset = new Hashset <Integer> (); // генерировать случайные числа и сохранить хэшсет для (int i = 0; i <values.length; i ++) {int number = random.nextint (100)+1; hashset.add (номер); } values = hashset.toarray (); // пройти данные массива и печати для (int i = 0; i <values.length; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Это немного более эффективно. Если мы ограничиваем длину массива, нам просто нужно преобразовать петлю и установить его в цикл WHLIE. Как показано ниже:
Импорт java.util.hashset; import java.util.random;/** * Реализация с использованием хэшсат * @description: * @file: test.java * @package none * @author hanyonglu * @date 2012-10-18 05:11:41 * @version v1.0 */public class {public static void void void main void void void void void void void void void void void void void void void void void void void void void void. Случайный(); Object [] values = новый объект [20]; Hashset <Integer> hashset = new Hashset <Integer> (); // генерировать случайные числа и хранить хэшсет в то время как (hashset.size () <values.length) {hashset.add (random.nextint (100) + 1); } values = hashset.toarray (); // пройти массив и распечатать данные для (int i = 0; i <values.length; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}}Мы можем установить длину массива на 100 и проверить эффект работы, как показано на рисунке ниже:
По сравнению с вышеизложенным использование HashMap относительно эффективно. На самом деле, это хэшсет, массив и, наконец, Arraylist. Если мы генерируем 10000 данных, мы обнаружим, что использование HashMap требует времени: 0,05 с, хэшсет составляет 0,07 с, массив составляет 0,20 с, а массив составляет 0,25 с. Если вам интересно, вы можете установить время, чтобы проверить его.
Конечно, в дополнение к использованию реализации HashMap, существуют другие эффективные методы. Например, мы можем хранить номера 1-100 в массиве, а затем случайным образом генерировать две подписки в цикле FO. Если эти два подписки не равны, мы можем обмениваться элементами в массиве. Процесс реализации выглядит следующим образом:
Import java.util.random;/** * Реализация преобразования случайных позиций * @description: * @file: demo4.java * @package non * @author hanyonglu * @date 2012-10-18 06:54:06 PM * @version v1.0 */public demo4 {public vatic void main (string) {] args) {in agrs) {in vagres) {in vagres) {in vagres) {in vargs) {] agres); int temp1, temp2, temp3; Случайный r = new Random (); for (int i = 0; i <values.length; i ++) {values [i] = i+1; } // Случайно обмениваться значениями. Время длины для (int i = 0; i <values.length; i ++) {temp1 = math.abs (r.nextint ()) % (values.length-1); // случайным образом генерировать одну позицию temp2 = math.abs (r.nextint ()) % (values.length-1); // случайным образом генерировать другую позицию if (temp1! = Temp2) {temp3 = values [temp1]; значения [temp1] = значения [temp2]; значения [temp2] = temp3; }} // пройти массив и распечатать данные для (int i = 0; i <20; i ++) {System.out.print (values [i]+"/t"); if ((i + 1) % 10 == 0) {System.out.println ("/n"); }}}} Этот метод также относительно эффективен. Если генерируется 10000 данных, время, которое он занимает, составляет 0,054.
Основываясь на реализации координат в массиве, могут быть преобразованы более связанные решения, и вы можете подробно обратиться к соответствующей информации.
Выше приведено в реализации функции случайных, неповрежденных чисел в Java. Конечно, методы не ограничиваются этими типами, но есть и другие методы реализации. Я надеюсь, что это будет полезно для друзей, которые некоторое время общались, и я надеюсь, что это сможет сыграть роль в привлечении и привлечении Джейд.
Оригинальный веб -сайт: http://www.cnblogs.com/hanyonglu/archive/2012/10/18/2730007.html
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.