其中的关键在于:每次循环随机获得一个下标,如果是首次访问到这个下标,将这个元素抽出到返回结果数组中,然后让这个数组下标index对应的元素引用一个其他任意对象srcNoContain(数组或集合不包含此对象)。如果下次循产生的随机下标index对应的元素与srcNoContain相等,表明这个下标已经被访问,这个下标对应的元素已经被抽取过了,不能再抽取它了。那么就要再进行循环获取新的随机下标,直到这个下标index对应的元素与srcNoContain不等时,就可以抽出一个这个下标对应的元素。

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Date;

import java.util.List;

import java.util.Random;

public class RandomUtil

{

private static final Random random;

static

{

random = new Random();

}

/**

* 从List集合中随机抽取指定数量的非重复元素

*

注意:集合中不能有null元素,否则返回值中可能有重复的元素

* @param src List集合源

* @param chooseCount 抽取的元素个数

* @return

* @see [类、类#方法、类#成员]

*/

public static List randomChooseElements(List src, int chooseCount)

{

return randomChooseElements(src, chooseCount, null);

}

/**

* 从List集合中随机抽取指定数量的非重复元素

* @param src List集合源

* @param chooseCount 抽取的元素个数

* @param srcNoContain 集合源中不包含的任意对象

* @return

* @see [类、类#方法、类#成员]

*/

public static List randomChooseElements(List src, int chooseCount, T srcNoContain)

{

for (Object element : src)

{

if (element == srcNoContain)

{

throw new IllegalStateException("指定的不同元素srcNoContain与参数src中的某一个元素相同");

}

}

if (chooseCount > src.size())

{

throw new IllegalArgumentException("参数chooseCount不能大于集合src的元素个数.");

}

int sizeOfCopiedList = src.size();

List copiedList = new ArrayList(src);

List choosedList = new ArrayList();

int index = -1;

for (int i = 0; i < chooseCount; i++)

{

while (true)

{

index = random.nextInt(sizeOfCopiedList);

if (copiedList.get(index) != srcNoContain)

{

choosedList.add(copiedList.get(index));

copiedList.set(index, srcNoContain);

break;

}

}

}

return choosedList;

}

/**

* 从数组中随机抽取指定数量的非重复元素

*

注意:数组中不能有null元素,否则返回值中可能有重复的元素

* @param src 数组源

* @param chooseCount 抽取的元素个数

* @return

* @see [类、类#方法、类#成员]

*/

public static Object[] randomChooseElements(Object[] src, int chooseCount)

{

return randomChooseElements(src, chooseCount, null);

}

/**

* 从数组中随机抽取指定数量的非重复元素

* @param src 数组源

* @param chooseCount 抽取的元素个数

* @param srcNoContain 源数组不包含的(类类型与数组的元素类型相同)任意对象

* @return

* @see [类、类#方法、类#成员]

*/

public static Object[] randomChooseElements(Object[] src, int chooseCount, Object srcNoContain)

{

for (Object element : src)

{

if (element == srcNoContain)

{

throw new IllegalStateException("指定的不同元素srcNoContain与参数src中的某一个元素相同");

}

}

if (chooseCount > src.length)

{

throw new IllegalArgumentException("参数chooseCount不能大于数组参数src的长度.");

}

Object[] copiedArray = Arrays.copyOf(src, src.length);

Object[] choosedArray = new Object[chooseCount];

int index = -1;

for (int i = 0; i < choosedArray.length; i++)

{

while (true)

{

index = random.nextInt(copiedArray.length);

if (copiedArray[index] != srcNoContain)

{

choosedArray[i] = copiedArray[index];

copiedArray[index] = srcNoContain;

break;

}

}

}

return choosedArray;

}

public static void main(String[] args)

{

List dates1 = Arrays.asList(new Date(119, 7, 21),

new Date(119, 3, 12),

new Date(119, 9, 7),

new Date(119, 3, 23));

List selectDates = randomChooseElements(dates1, 3);

System.out.println("源集合是:"+dates1);

System.out.println("集合中随机抽取的元素:"+selectDates);

System.out.println();

Date[] dates = new Date[] {new Date(119, 7, 21), new Date(119, 3, 12), new Date(119, 9, 7),

new Date(119, 3, 23)};

Object[] arr1 = randomChooseElements(dates, 2);

System.out.println("源数组是"+Arrays.toString(dates));

System.out.println("数组中随机选择出来元素" + Arrays.toString(arr1));

}

}

控制台输出

另外,其实JDK自带的Collections工具类提供了两个随机打乱集合的方法shuffle(List> list) 与shuffle(List> list, Random rnd) ,经过一此处理变通后,数组和集合都可以用这两个静态方法处理。

Date[] dates = new Date[] {new Date(119, 7, 21), new Date(119, 3, 12), new Date(119, 9, 7),new Date(119, 3, 23)};

List copiedDates=new ArrayList(

Arrays.asList(Arrays.copyOf(dates, dates.length)));

Collections.shuffle(copiedDates);

System.out.println(copiedDates);

System.out.println("原"+Arrays.toString(dates));

java 随机抽取数组内容_工具类:随机抽取数组或集合中的几个不重复元素相关推荐

  1. java 数字转化为汉字_工具类_java 数字转化为汉字大写

    public class Num2Rmb { private String[] hanArr = { "零", "壹", "贰", &quo ...

  2. java sql查询空内容_返回null值而不是sql查询中的空集

    比方说,有两个表: select * from users; +-------+------+ | login | type | +-------+------+ | test1 | A | | te ...

  3. 【java】数组判空工具类

    数组判空工具类 package com.dost.base.utils.extend;import java.util.List;/*** 数组工具*/ public abstract class A ...

  4. aliyun短信服务包含随机生成四位数字验证码工具类

    .1.pom文件 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sd ...

  5. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  6. Java 图片添加数字暗水印工具类

    Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...

  7. Java判断不为空的工具类总结

    Java判断不为空的工具类总结 1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. 1 package com.bie.util; 2 3 import jav ...

  8. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  9. mac json工具_工具类封装的思路 | 钉钉群机器人为例

    大家好,我是小刀 大家好, 我是小刀,算起来好像有半个月没写文章了,是不是都快忘了我呀 这半个月虽然文章没写,但是鼓捣了不少工具类,搞着搞着发现,这些工具类虽然功能不一样,但是封装的思路和组织的方式很 ...

  10. Java时间戳与日期格式转换工具类

    Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...

最新文章

  1. laravel5.5 不能正常自动回复的问题
  2. 求复变函数的 Taylor 展式与 Laurent 展式[华中师范大学2010年复变函数复试试题]...
  3. Java基础篇:封装、继承、多态三大特性
  4. python 下标 遍历列表_python中的数据结构与算法(1):列表、元组与字符串
  5. 一首最接近完美的天籁之音+莎拉布莱曼《斯卡布罗集市》+
  6. mysql不同服务器查询_实战操作SQL Server连接查询不同服务器表数据
  7. mysql oracle视频网盘_前端和后端终极学习视频(百度网盘资料)
  8. 医用计算机考试题目,2015年全国计算机应医用能力考试辅导资料.doc
  9. NOWAIT及SKIP LOCKED的使用
  10. mysql增加字段 first_MySQL教程41-MySQL数据表添加字段
  11. Python中MNE库的事件相关特定频段分析(MEG数据)
  12. 【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
  13. 感激爸妈----您们辛苦了
  14. Excel分类汇总2个维度的结果,1个计数1个求和
  15. Python爬虫入门教程07:腾讯视频弹幕爬取
  16. 目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法
  17. Giv Svn Branch 操作
  18. 使用opencv进行USB摄像头参数配置
  19. 1.1.8 DR和BDR
  20. 张艾迪(创始人):拥抱单身与自由的Eidyzhang

热门文章

  1. arcgis中 shift数据重新定义投影_【更新85篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
  2. 联合概率分布、边缘概率分布
  3. [UPF]理解UPF功率域和域边界
  4. oracle得oem,Oracle--OEM与常见故障处理
  5. MATLAB中使用XLSREAD无法找到文件的一种解决方法
  6. STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以太网芯片,本人发现其配置起来比较麻烦,所以整理了一份STM32F107单片机驱动Dp83848的程序代码例
  7. 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
  8. 虚拟局域网软件开源_基于开源AUTOSAR的高级驾驶员辅助系统的设计与实现过程...
  9. QT QTableView(基于QStandardItemModel用法)操作详解
  10. jxls模板hashmap_使用Java + jxls基于模板导出excel