博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 编程下实现随机无重复数字功能
阅读量:5351 次
发布时间:2019-06-15

本文共 3828 字,大约阅读时间需要 12 分钟。

一般有点开发经验的朋友都能实现这样的功能,只不过是效率上的问题。我们一般在面对这样的问题时,总会平铺直序的联想到,先生成一个数组,然后在一个循环中向数组中添加随机数字,在添加数字的过程中先查找一下数组中是否存在这个数字,如果不存在这个数字就直接添加到数组中;如果存在这个数字就不添 加。我们一般都是这样考虑问题的,这样考虑也能实现功能,我刚才也说了,只不过是效率上的问题。

为了更好地理解这个题意,我们先来看下具体内容:生成一个1-100 的随机数组,但数组中的数字不能重复,即位置是随机的,但数组元素不能重复。在这里,没有给我们规定数组的长度,我们可以让它是1-100之间的任意长度。

接下来让我们看一下如何更好地实现它,通常我们会使用 ArrayList 来实现,如下面代码所示:

package cn.sunzn.randomnumber;import java.util.ArrayList;import java.util.Random;public class Demo {   public static void main(String[] args) {       Object[] values = new Object[20];       Random random = new Random();       ArrayList
list = new ArrayList
(); 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"); } } }}

上面这个实现过程效率比较低的。因为在每次添加时都要去遍历一下当前列表中是否存在这个数字,时间复杂度是 O(N^2)。我们可以这样思考一下:既然涉及到无重复,我们可以想一下 HashSet 和 HashMap 的功能。HashSet 实现 Set 接口,Set 在数学上的定义就是无重复,无次序的集合。而 HashMap 实现 Map,也是不允许重复的 Key。这样我们可以使用 HashMap 或 HashSet 来实现。

在使用 HashMap 实现时,只需要将它的 key 转化成数组就可以了,代码如下:

package cn.sunzn.randomnumber;import java.util.HashMap;import java.util.Random;public class Demo {   public static void main(String[] args) {       Object[] values = new Object[20];       Random random = new Random();       HashMap
hashMap = new HashMap
(); /******* 生成随机数字并存入 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"); } } }}

由于 HashSet 和 HashMap 的关系太近了,HashSet 在底层就是用 HashMap 来实现的,只不过没有 Value 的集合,只有一个 Key 的集合,所以也可使用 HashSet 来实现,代码如下:

package cn.sunzn.randomnumber;import java.util.HashSet;import java.util.Random;public class Demo {   public static void main(String[] args) {       Random random = new Random();       Object[] values = new Object[20];       HashSet
hashSet = new HashSet
(); /******* 生成随机数字并存入 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 循环就可以了。如下所示:

package cn.sunzn.randomnumber;import java.util.HashSet;import java.util.Random;public class Demo {   public static void main(String[] args) {       Random random = new Random();       Object[] values = new Object[20];       HashSet
hashSet = new HashSet
(); /****** 生成随机数字并存入 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"); } } }}

 

转载于:https://www.cnblogs.com/sunzn/archive/2013/03/14/2960323.html

你可能感兴趣的文章
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>