本文给人人引见如安在JAVA中完成随机无反复数字的功用。(相干视频课程引荐:java视频教程)
为了更好地明白这个题意,我们先来看下具体内容:生成一个1-100的随机数组,但数组中的数字不能反复,即位置是随机的,但数组元素不能反复。
在这里呢,没有给我们划定数组的长度,我们能够让它是1-100之间的恣意长度。
接下来让我们看一下几种完成要领并对这几种要领作个对照。
一般我们会运用ArrayList或数组来完成,先来看下ArrayList完成历程,以下面代码所示:
import java.util.ArrayList; import java.util.Random; /** * 运用ArrayList完成 * @Description: * @File: Demo.java * @Date 2012-10-18 下昼06:16:55 * @Version V1.0 */ public class Demo { public static void main(String[] args) { Object[] values = new Object[20]; Random random = 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(); // 遍历数组并打印数据 for(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 None * @Author Hanyonglu * @Date 2012-10-18 下昼06:27:38 * @Version V1.0 */ public class Demo4 { public static void main(String[] args) { int[] values = new int[20]; Random random = 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; } } } // 遍历数组并打印数据 for(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和HashMap的功用。
HashSet完成Set接口,Set在数学上的定义就是无反复,无次序的鸠合。而HashMap完成Map,也是不允许反复的Key。如许我们能够运用HashMap或HashSet来完成。
在运用HashMap完成时,只需要将它的key转化成数组就Ok了,以下代码:
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:50 * @Version V1.0 */ public class Demo { public static void main(String[] args) { int n = 0; Object[] values = new Object[20]; Random random = new Random(); HashMap<Object, Object> hashMap = new HashMap<Object, Object>(); // 生成随机数字并存入HashMap for(int i = 0;i < values.length;i++){ int number = random.nextInt(100) + 1; hashMap.put(number, i); } // 从HashMap导入数组 values = hashMap.keySet().toArray(); // 遍历数组并打印数据 for(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(); // // 遍历HashMap // while (iter.hasNext()) { // Entry<Integer, Integer> entry = (Entry)iter.next(); // int key = entry.getKey(); // n++; // // System.out.print(key + "\t"); // // if(n % 10 == 0){ // System.out.println("\n"); // } // } } }
因为HashSet和HashMap的关联太近了,HashSet在底层就是用HashMap来完成的,只不过没有Value的鸠合,只要一个Key的鸠合,所以也可运用HashSet来完成,以下代码:
import java.util.HashSet; import java.util.Random; /** * 运用HashSet完成 * @Description: * @File: Test.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下昼06:11:41 * @Version V1.0 */ public class Test { public static void main(String[] args) { Random random = new Random(); Object[] values = new Object[20]; HashSet<Integer> hashSet = new HashSet<Integer>(); // 生成随机数字并存入HashSet for(int i = 0;i < values.length;i++){ int number = random.nextInt(100) + 1; hashSet.add(number); } values = hashSet.toArray(); // 遍历数组并打印数据 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
如许完成效力轻微好些。假如给我们限制了数组的长度,只需要变换下for轮回,设置成whlie轮回就能够了。以下所示:
import java.util.HashSet; import java.util.Random; /** * 运用HashSet完成 * @Description: * @File: Test.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下昼05:11:41 * @Version V1.0 */ public class Test { public static void main(String[] args) { Random random = new Random(); Object[] values = new Object[20]; HashSet<Integer> hashSet = new HashSet<Integer>(); // 生成随机数字并存入HashSet while(hashSet.size() < values.length){ hashSet.add(random.nextInt(100) + 1); } values = hashSet.toArray(); // 遍历数组并打印数据 for(int i = 0;i < values.length;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
以上几种相比较而言,运用HashMap的效力是比较高的,实际上是HashSet,再次是数组,末了是ArrayList。假如我们生成10000个数据将会发明,运用HashMap消费时候是:0.05s,HashSet是0.07s,数组是:0.20s,而ArrayList是0.25s。有兴致的能够设置下时候检察一下。
固然了,除了运用HashMap完成外,另有别的高效的要领。比方,我们能够把1-100这些数字存储在一个数组中,然后在for轮回中随机发生两个下标,假如这两个下标不相等的话,能够交流数组中的元素,完成历程以下所示:
import java.util.Random; /** * 随机换取位置完成 * @Description: * @File: Demo4.java * @Package None * @Author Hanyonglu * @Date 2012-10-18 下昼06:54:06 * @Version V1.0 */ public class Demo4 { public static void main(String[] args) { int values[] = new int[100]; int temp1,temp2,temp3; Random r = new Random(); for(int i = 0;i < values.length;i++){ values[i] = i + 1; } //随机交流values.length次 for(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]; values[temp1] = values[temp2]; values[temp2] = temp3; } } // 遍历数组并打印数据 for(int i = 0;i < 20;i++){ System.out.print(values[i] + "\t"); if(( i + 1 ) % 10 == 0){ System.out.println("\n"); } } } }
更多java相干文章请关注java基础教程。
以上就是java生成不反复的随机数要领总结的细致内容,更多请关注ki4网别的相干文章!