java 随机抽取数组内容_工具类:随机抽取数组或集合中的几个不重复元素
其中的关键在于:每次循环随机获得一个下标,如果是首次访问到这个下标,将这个元素抽出到返回结果数组中,然后让这个数组下标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 随机抽取数组内容_工具类:随机抽取数组或集合中的几个不重复元素相关推荐
- java 数字转化为汉字_工具类_java 数字转化为汉字大写
public class Num2Rmb { private String[] hanArr = { "零", "壹", "贰", &quo ...
- java sql查询空内容_返回null值而不是sql查询中的空集
比方说,有两个表: select * from users; +-------+------+ | login | type | +-------+------+ | test1 | A | | te ...
- 【java】数组判空工具类
数组判空工具类 package com.dost.base.utils.extend;import java.util.List;/*** 数组工具*/ public abstract class A ...
- aliyun短信服务包含随机生成四位数字验证码工具类
.1.pom文件 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sd ...
- Java实现Google的S2算法工具类
WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...
- Java 图片添加数字暗水印工具类
Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...
- Java判断不为空的工具类总结
Java判断不为空的工具类总结 1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. 1 package com.bie.util; 2 3 import jav ...
- java配置文件工具类,java项目加载配置文件的工具类
java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...
- mac json工具_工具类封装的思路 | 钉钉群机器人为例
大家好,我是小刀 大家好, 我是小刀,算起来好像有半个月没写文章了,是不是都快忘了我呀 这半个月虽然文章没写,但是鼓捣了不少工具类,搞着搞着发现,这些工具类虽然功能不一样,但是封装的思路和组织的方式很 ...
- Java时间戳与日期格式转换工具类
Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...
最新文章
- laravel5.5 不能正常自动回复的问题
- 求复变函数的 Taylor 展式与 Laurent 展式[华中师范大学2010年复变函数复试试题]...
- Java基础篇:封装、继承、多态三大特性
- python 下标 遍历列表_python中的数据结构与算法(1):列表、元组与字符串
- 一首最接近完美的天籁之音+莎拉布莱曼《斯卡布罗集市》+
- mysql不同服务器查询_实战操作SQL Server连接查询不同服务器表数据
- mysql oracle视频网盘_前端和后端终极学习视频(百度网盘资料)
- 医用计算机考试题目,2015年全国计算机应医用能力考试辅导资料.doc
- NOWAIT及SKIP LOCKED的使用
- mysql增加字段 first_MySQL教程41-MySQL数据表添加字段
- Python中MNE库的事件相关特定频段分析(MEG数据)
- 【云原生|实践指北】5:真实业务场景下云原生项目落地实践学习
- 感激爸妈----您们辛苦了
- Excel分类汇总2个维度的结果,1个计数1个求和
- Python爬虫入门教程07:腾讯视频弹幕爬取
- 目标检测论文解读复现之十五:基于YOLOv5的光学遥感图像舰船 目标检测算法
- Giv Svn Branch 操作
- 使用opencv进行USB摄像头参数配置
- 1.1.8 DR和BDR
- 张艾迪(创始人):拥抱单身与自由的Eidyzhang
热门文章
- arcgis中 shift数据重新定义投影_【更新85篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
- 联合概率分布、边缘概率分布
- [UPF]理解UPF功率域和域边界
- oracle得oem,Oracle--OEM与常见故障处理
- MATLAB中使用XLSREAD无法找到文件的一种解决方法
- STM32F107单片机驱动Dp83848以太网芯片程序 项目开发用到了Dp83848这一个以太网芯片,本人发现其配置起来比较麻烦,所以整理了一份STM32F107单片机驱动Dp83848的程序代码例
- 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
- 虚拟局域网软件开源_基于开源AUTOSAR的高级驾驶员辅助系统的设计与实现过程...
- QT QTableView(基于QStandardItemModel用法)操作详解
- jxls模板hashmap_使用Java + jxls基于模板导出excel