工具类:随机抽取数组或集合中的几个不重复元素
时间:2019-08-28
本文章向大家介绍工具类:随机抽取数组或集合中的几个不重复元素,主要包括工具类:随机抽取数组或集合中的几个不重复元素使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
其中的关键在于:每次循环随机获得一个下标,如果是首次访问到这个下标,将这个元素抽出到返回结果数组中,然后让这个数组下标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集合中随机抽取指定数量的非重复元素 * <p>注意:集合中不能有null元素,否则返回值中可能有重复的元素 * @param src List集合源 * @param chooseCount 抽取的元素个数 * @return * @see [类、类#方法、类#成员] */ public static <T> List<T> randomChooseElements(List<T> src, int chooseCount) { return randomChooseElements(src, chooseCount, null); } /** * 从List集合中随机抽取指定数量的非重复元素 * @param src List集合源 * @param chooseCount 抽取的元素个数 * @param srcNoContain 集合源中不包含的任意对象 * @return * @see [类、类#方法、类#成员] */ public static <T> List<T> randomChooseElements(List<T> 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<T> copiedList = new ArrayList<T>(src); List<T> choosedList = new ArrayList<T>(); 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; } /** * 从数组中随机抽取指定数量的非重复元素 * <p>注意:数组中不能有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<Date> dates1 = Arrays.asList(new Date(119, 7, 21), new Date(119, 3, 12), new Date(119, 9, 7), new Date(119, 3, 23)); List<Date> 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)); } }
原文地址:https://www.cnblogs.com/gocode/p/extract-unique-and-random-elements-in-array.html
- CentOS7.3 安装 iptables 与详细使用
- CentOs7.3 安装 maven3.5
- 基础篇章:关于 React Native 之 Picker 组件的讲解
- Java8的十大新特性你了解多少呢?
- spring 监听器
- ELK 集群 Kibana 使用 X-Pack 权限控制,监控集群状态,实时的生成,警报,监视,cpu,内存,磁盘空间,等等一系列,报告和的可视化图形
- Dubbo详细介绍与安装使用过程
- 基础篇章:关于 React Native之 ActivityIndicator 组件的讲解
- 基础篇章:关于 React Native 之 KeyboardAvoidingView 组件的讲解
- 基础篇章:关于 React Native 之 Slider 组件的讲解
- Java9 中的 9 个新特性
- ELK 集群 + X-Pack + Redis 集群 + Nginx ,实时日志(数据)搜集和分析的监控系统,简单上手使用
- 基础篇章:关于 React Native 之 Modal 组件的讲解
- 搭建高吞吐量 Kafka 分布式发布订阅消息 集群
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法