当前位置:  编程技术>java/j2ee

Java 中实现随机无重复数字的方法

    来源: 互联网  发布时间:2014-10-23

    本文导语:  一般有点开发经验的朋友都能实现这样的功能,只不过是效率上的问题。我们一般在面对这样的问题时,总会平铺直序的联想到,先生成一个数组,然后在一个循环中向数组中添加随机数字,在添加数字的过程中先查找一下数...

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

为了更好地理解这个题意,我们先来看下具体内容:生成一个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");
           }
       }
   }
}


    
 
 

您可能感兴趣的文章:

  • 如何在JAVA中实现类似VC中sprintf的功能
  • 如何在java 的class中实现转向另一页?
  • 请问如何在Java中实现定时调用的功能。
  • java swing中实现拖拽功能示例
  • JAVA中实现链式操作(方法链)的简单例子
  • java中实现汉字按照拼音排序(示例代码)
  • Java、JavaScript、Oracle、MySQL中实现的MD5加密算法分享
  • java实现判断字符串是否全是数字的四种方法代码举例
  • 请教:Java 中数字字符串转化为数字的问题
  • 请问Java中如何在控制台一行内输入n个数字,然后再在一行内输出这些数字
  • Java把数字格式化为货币字符串实例代码 iis7站长之家
  • 如何在java中将任意字符转化为数字
  • java中如何将数字转化为字符串并且不足位数补0
  • java正则表达式提取数字的方法实例
  • Java Servlets中数字求余问题
  • java使用正则表达为数字添加千位符的简单方法
  • web程序出错后,错误提示后面跟着的数字(25)是什么意思?(ConnectionPool.java:25)
  • java控制台输出数字金字塔示例分享
  • 请教JAVA小问题:如何将含数字的String类型的对象转化为int或long类型
  • Java把数字格式化为货币字符串实例代码
  • 请问在javabean,java和jsp代码中如何判断一个字符串是否数字,还有如何把string转换成int!!!高分请教!!!
  • Java判断字符串为空、字符串是否为数字
  • 88分,吉利的数字,小问题一个,有关java字符串基础问题,很好赚分的
  • 请问,JAVA里有什么可以将一个数字截取到小数点后第二位后的函数么?谢谢
  • 有没有使用java.security类来加密文本(不是数字签名)的程序?可否给我看看.我不会用那个类.最好是用RSA和DES算法的.
  • 在Java中如何确定浮点数的精度,例如如何按要求确定小数点后面的数字个数???
  • java 格式化输出数字的方法
  • java数字图像处理基础使用imageio写图像文件示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.lang类runtime的类成员方法: runfinalization定义及介绍
  • Java中如何通过方法名动态调用方法?
  • java命名空间java.awt.im类inputcontext的类成员方法: getinputmethodcontrolobject定义及介绍
  • <%@ page import="java.lang.Math"%>后用round(float a)方法,怎么报找不到round方法?
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • java初学--在java中有个native本地方法 说是能嵌入c 不知道具体?
  • java命名空间java.lang类system的类成员方法: runfinalization定义及介绍
  • 在JAVA中只有一种派生子类的方法吗?我记得在C++ 中有3种派生方法的!
  • java命名空间java.lang类stacktraceelement的类成员方法: isnativemethod定义及介绍
  • java根据方法名称取得反射方法的参数类型示例
  • java命名空间java.lang类stacktraceelement的类成员方法: getmethodname定义及介绍
  • 请问java.sql包中 preparedStatement 对象的setString(int parameterIndex,java.lang.String x)方法怎么用?
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: dispose定义及介绍
  • java.util类对象的DATE方法为何不能用? <%=new java.util.date()%>,在页面中是这样写的,服务器用的是Resin.
  • java命名空间java.net类httpurlconnection的类成员方法: getrequestmethod定义及介绍
  • 有没有一种工具可以让java自动调出类的方法、成员?就像Delphi一样,写完Edit1.系统会跳出一些TEdit的属性、方法。
  • java命名空间java.security类policyspi的类成员方法: enginerefresh定义及介绍
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: getcontrolobject定义及介绍
  • java 与 C++ 实现后绑定的方法
  • java命名空间java.security类policy的类成员方法: refresh定义及介绍
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3