Java给定一些元素随机从中选择一个

文章目录

    • 代码实现
      • java.util.Random类实现随机取数(推荐)
      • java.util.Collections实现(推荐)
      • Java 8 Stream流实现(不推荐)
    • 完整代码参考(含测试数据)

在Java中,要从给定的数据集合中随机选择一个元素,我们很容易想到可以使用 java.util.Random类来生成随机索引,然后根据这个索引从集合中取出对应的元素。有没有其他办法呢?

  1. 除了使用java.util.Random,还可以使用java.util.Collections工具类中的shuffle方法结合List的get方法来实现随机选择元素。这种方法会将列表中的元素顺序打乱,然后返回第一个元素,由于shuffle操作是随机的,所以第一个元素实际上就是随机选择的。
  2. 从Java 8开始,可以利用流(Streams)和IntStream来生成随机索引,再根据索引来获取元素。这种方式更加现代化且简洁,但性能上可能略逊于直接使用RandomCollections.shuffle,尤其是在大数据量的情况下。

代码实现

java.util.Random类实现随机取数(推荐)

    /*** 从给定的字符串列表中随机选择一个元素。** @param list 要从中选择元素的列表* @return 随机选择的元素*/public static String selectRandomStringElement(List<String> list) {Random random = new Random();return list.get(random.nextInt(list.size()));}/*** 从给定的列表中随机选择一个元素(通用)** @param list 要从中选择元素的列表* @return 随机选择的元素*/public static T selectRandomElement(List<T> list) {Random random = new Random();return list.get(random.nextInt(list.size()));}

在这段代码中,我们首先创建了一个Random对象。然后,我们使用nextInt(int bound)方法生成一个介于0(含)和列表大小(不含)之间的随机整数,这将作为列表的索引用来随机取数

java.util.Collections实现(推荐)

除了使用java.util.Random,还可以使用java.util.Collections工具类中的shuffle方法结合List的get方法来实现随机选择元素。这种方法会将列表中的元素顺序打乱,然后返回第一个元素,由于shuffle操作是随机的,所以第一个元素实际上就是随机选择的。
下面是一个使用Collections.shuffle方法来随机选择元素的例子:

    /*** 从给定的列表中随机选择一个元素(Collections实现)** @param <T> 列表元素的类型* @param list 要从中选择元素的列表* @return 随机选择的元素*/public static <T> T collectionsSelectRandomElement(List<T> list) {if (list == null || list.isEmpty()) {throw new IllegalArgumentException("List must not be null or empty.");}Collections.shuffle(list);// 返回第一个元素,由于列表已经被打乱,所以它是随机的return list.get(0);}

需要注意的是,Collections.shuffle方法会改变原列表的顺序,如果不想修改原始列表,可以在shuffle之前创建一个新列表的副本。例如,可以使用new ArrayList<>(originalList)来创建一个新列表,然后在新列表上调用shuffle方法。

Java 8 Stream流实现(不推荐)

    /*** 从给定的列表中随机选择一个元素。(不推荐)** @param <T> 列表元素的类型* @param list 要从中选择元素的列表* @return 随机选择的元素,如果列表为空则返回null*/public static <T> T streamSelectRandomElement(List<T> list) {if (list == null || list.isEmpty()) {return null;}// 使用Stream API来获取随机索引的元素return  list.stream().skip(new java.util.Random().nextInt(list.size())).findFirst().orElse(null);}

这个实现看起来优雅展示了如何使用Stream API,但是应该注意,对于简单的随机选择操作,直接使用Random类生成索引并访问列表可能更为直接和高效。使用Stream API在这种场景下可能会引入不必要的复杂性和性能开销,特别是当列表非常大时。

完整代码参考(含测试数据)

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;/*** @author 共饮一杯无* @date 2024/7/23 16:01* @description:随机选择器*/
public class RandomStringSelector {/**证书编号*/public static final List<String> certNos = Arrays.asList("135792468024680246","147258369052854901","159357246059357246","172839506172839506","180451672839506172","192837456098765432","113579246802468024","125829174365079321","145368752345678901","102394838475873456");// 申请人(账号)public static final List<String> applicantAccounts = Arrays.asList("13800005678", "15900002345", "18600006789", "13700001234", "15000005678","18000009012", "13900003456", "15500007890", "18500002345", "13000067803");// 申请人名称public static final List<String> applicantNames = Arrays.asList("张明轩", "王思琪", "李浩宇", "赵欣怡", "刘子涵", "陈雨萱", "郑伟杰", "黄雅芳", "周文博", "吴晓东");// 身份标识public static final List<String> identityIds = Arrays.asList("1101*************1234", "3203*************5678", "5101*************9012", "4403*************3456", "2202*************7890","6101*************2345", "3502*************6789", "4501*************0123", "5002*************4567", "1301*************890");// 企业信用代码public static final List<String> creditCodes = Arrays.asList("91330100CU3LN3X72H", "913301008U5MBCEY71", "91330100T6XJLGYT2Q", "91330100T6XJLGYT2Q", "913301007NFBA43X7E","91110000RJHN2DGH5T", "911100007HG45QCP5X", "911100009DMGUGE126", "91110000P47RM6EL1W", "91110000H2WK85LRX9");// 申请时间public static final List<String> applicationDates = Arrays.asList("2024-07-22 00:00:00", "2024-07-22 01:15:30", "2024-07-22 02:30:45", "2024-07-22 03:45:12", "2024-07-22 05:00:00","2024-07-22 06:15:27", "2024-07-22 07:30:55", "2024-07-22 08:45:08", "2024-07-22 10:00:33", "2024-07-22 11:59:59");// 文件名称public static final List<String> fileNames = Arrays.asList("data_visualization_trends_2024_analysis_report.pdf", "user_interface_prototype_v2.3_design_overview.jpg", "project_milestone_documentation_Q3_2024.docx","animation_sequence_demo_character_intro_mp4", "code_refactoring_best_practices_guide_v1.0.pdf", "software_architecture_diagram_application_structure.jpg","video_editing_tutorial_beginner_to_advanced_mp4", "database_schema_design_document_v2.2.docx", "UI_UX_case_study_ecommerce_platform_improvements.pdf","project_requirements_specification_document_v3.2_detailed_functional_analysis_for_client_approval.pdf");// 文件大小public static final List<String> fileSizes = Arrays.asList("500 MB", "12.5 KB", "2.34 MB", "987 KB", "45.67 MB", "1 MB", "678.9 KB", "1.02 MB", "56 KB");// 区块链唯一标识public static final List<String> blockchainIdentifiers = Arrays.asList("3a98f06f127419f1a4015637521591874e899266613f3e7b7f1249f7762378e4","5f4dcc3b5aa765d61d8327deb882cf994f30283082bd8065132e044f04d4991b","a0e4403f497677241542d3511d88f397e87c1414d1a02906f392bd1d1453dbec","9e872d39e3212777c070f10f4a2379d3ee5e46b0df209c029a7d474e8011465f","b7e020b92709981a98542113a2fc6a2a240d8bb3c1c2c63f356244a6b4b4e8ad","71c480df93f469decbc3c1d2e4f29f148c7a0f46da0cd3293fddbd27d165667f","f05a5b6a56a3e5e4b39f0f85c5c114afe2b371f50c3a37e83457084f277037d8","1f66ab40a6750a74e4a807930bc9eef0c3a202422f3a8d7a617e3ab6832470d7","d296eefe2f7f6f0a9ba1e3f0bc0c520f7445da4099cac652d4e63e73b3d94b3c","248d6a61d20638b8e5c026930c3e600f13c0d85c8f85ac8c00c1808f8efc82a0");/*** 从给定的字符串列表中随机选择一个元素。** @param list 要从中选择元素的列表* @return 随机选择的元素*/public static String selectRandomStringElement(List<String> list) {Random random = new Random();return list.get(random.nextInt(list.size()));}/*** 从给定的列表中随机选择一个元素(通用)** @param list 要从中选择元素的列表* @return 随机选择的元素*/public static <T> T selectRandomElement(List<T> list) {Random random = new Random();return list.get(random.nextInt(list.size()));}/*** 从给定的列表中随机选择一个元素(Collections实现)** @param <T> 列表元素的类型* @param list 要从中选择元素的列表* @return 随机选择的元素*/public static <T> T collectionsSelectRandomElement(List<T> list) {if (list == null || list.isEmpty()) {throw new IllegalArgumentException("List must not be null or empty.");}Collections.shuffle(list);// 返回第一个元素,由于列表已经被打乱,所以它是随机的return list.get(0);}/*** 从给定的列表中随机选择一个元素。(不推荐)** @param <T> 列表元素的类型* @param list 要从中选择元素的列表* @return 随机选择的元素,如果列表为空则返回null*/public static <T> T streamSelectRandomElement(List<T> list) {if (list == null || list.isEmpty()) {return null;}// 使用Stream API来获取随机索引的元素return  list.stream().skip(new java.util.Random().nextInt(list.size())).findFirst().orElse(null);}public static void main(String[] args) {System.out.println(selectRandomStringElement(certNos));System.out.println(selectRandomElement(applicantAccounts));System.out.println(collectionsSelectRandomElement(applicantNames));System.out.println(collectionsSelectRandomElement(identityIds));System.out.println(streamSelectRandomElement(creditCodes));System.out.println(collectionsSelectRandomElement(applicationDates));System.out.println(collectionsSelectRandomElement(fileNames));System.out.println(collectionsSelectRandomElement(fileSizes));System.out.println(collectionsSelectRandomElement(blockchainIdentifiers));}}

执行结果:
去去去.gif
可以看到每执行一次会随机生成不同的数据。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487470.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ARM系列运行异常排查

一、断点指令BKPT BKPT指令产生软件断点中断&#xff0c;可用于程序的调试。它使处理器停止执行正常指令&#xff08;使处理器中止预取指&#xff09;而进入相应的调试程序。 BKPT指令的格式为&#xff1a;BKPT 16位的立即数 二、使用BKPT进行软件异常定位 假设异常发生后…

electron 网页TodoList应用打包win桌面软件数据持久化

参考&#xff1a; electron 网页TodoList工具打包成win桌面应用exe https://blog.csdn.net/weixin_42357472/article/details/140648621 electron直接打包exe应用&#xff0c;打开网页上面添加的task在重启后为空&#xff0c;历史没有被保存&#xff0c;需要持久化工具保存之前…

铠侠最新BiCS8 218L NAND键合技术

随着存储技术的不断演进&#xff0c;Hybrid Bonding&#xff08;混合键合&#xff09;技术正逐渐成为内存和存储应用领域的重要组成部分。TechInsights最近对KIOXIA/WD BiCS8 218L CBA 1 Tb 3D TLC NAND进行了深入分析&#xff0c;揭示了这项技术如何在提高存储密度、降低功耗和…

在Windows下部署jar包,关闭命令提示符可以后台运行

前言 大多数情况下&#xff0c;都是选用Linux作为服务器部署服务&#xff0c;在Linux中通过以下命令运行 nohup java -jar xxxxx-1.0-SNAPSHOT.jar 但是有时由于其他原因&#xff0c;或本地测试&#xff0c;或云服务器使用Windows server等等&#xff0c;需要在Windows上面运…

[嵌入式Linux]-常见编译框架与软件包组成

嵌入式常见编译框架与软件包组成 1.嵌入式开发准备工作 主芯片资料包括&#xff1a; 主芯片资料 主芯片开发参考手册&#xff1b;主芯片数据手册&#xff1b;主芯片规格书&#xff1b; 硬件参考 主芯片硬件设计参考资料&#xff1b;主芯片配套公板硬件工程&#xff1b; 软件…

学术研讨 | 基于区块链的隐私计算与数据可信流通研讨会顺利召开

近日&#xff0c;由国家区块链技术创新中心组织的“基于区块链的隐私计算与数据可信流通研讨会”顺利召开&#xff0c;会议邀请了来自全国高校和科研院所的相关领域专家&#xff0c;围绕基于区块链与隐私计算技术的应用需求、研究现状、发展趋势、重点研究方向与研究进展等内容…

基于 LlamaIndex 构建自己的 RAG 知识库

创建虚拟环境用于运行 运行 InternLM 的基础环境&#xff0c;命名为 llamaindex conda create -n llamaindex python3.10 查看存在的环境 conda env list 激活刚刚创建的环境 conda activate llamaindex 安装基本库pytorch,torchvision ,torchaudio,pytorch-cuda 并指定通道&…

【React】JSX 实现列表渲染

文章目录 一、基础语法1. 使用 map() 方法2. key 属性的使用 二、常见错误和注意事项1. 忘记使用 key 属性2. key 属性的选择 三、列表渲染的高级用法1. 渲染嵌套列表2. 条件渲染列表项3. 动态生成组件 四、最佳实践 在 React 开发中&#xff0c;列表渲染是一个非常常见的需求。…

Mac装虚拟机占内存吗 Mac用虚拟机装Windows流畅吗

如今&#xff0c;越来越多的Mac用户选择在他们的设备上安装虚拟机来运行不同的操作系统。其中&#xff0c;最常见的是使用虚拟机在Mac上运行Windows。然而&#xff0c;许多人担心在Mac上装虚拟机会占用大量内存&#xff0c;影响电脑系统性能。此外&#xff0c;有些用户还关心在…

Nginx Proxy缓存

Proxy缓存 缓存类型 网页缓存 &#xff08;公网&#xff09;CDN数据库缓存 memcache redis网页缓存 nginx-proxy客户端缓存 浏览器缓存 模块 ngx_http_proxy_module 语法 缓存开关 Syntax: proxy_cache zone | off; Default: proxy_cache off; Context: http,…

【JavaEE】Bean的作用域和生命周期

一.Bean的作用域. 1.1 Bean的相关概念. 通过Spring IoC和DI的学习(不清楚的可以看的前面写过的总结,可以快速入门, http://t.csdnimg.cn/K8Xr0),我们知道了Spring是如何帮助我们管理对象的 通过 Controller , Service , Repository , Component , Configuration , Bean 来声明…

开发桌面程序-Electron入门

Electron是什么 来自官网的介绍 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 总…

JL 跳转指令的理解

一般情况下&#xff0c;JU 和 JC 是最常见的跳转指令&#xff1b;但有时会用到JL 指令&#xff0c;JL 说起来更像是一组指令&#xff0c;类似C,C# 语言中的 switch case 语句&#xff0c;但是有个明显的不同&#xff0c;前者的判断条件可以是任意合理数字&#xff0c;后者范围…

C语言 之 理解指针(1)

文章目录 1. 内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 指针类型的理解2.2.3 解引用操作符(*) 2.3 指针变量的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针-…

【科研】# Taylor Francis 论文 LaTeX template模版 及 Word模版

【科研写论文】系列 文章目录 【科研写论文】系列前言一、Word 模板&#xff08;附下载网址&#xff09;&#xff1a;二、LaTeX 版本方法1&#xff1a;直接网页端打开&#xff08;附网址&#xff09;方法2&#xff1a;直接下载到本地电脑上编辑下载地址说明及注意事项 前言 给…

计算机网络基础:4.HTTP与HTTPS

一、回顾设定 想象你在经营一家繁忙的餐厅&#xff0c;顾客们通过点餐系统&#xff08;网卡&#xff09;下单&#xff0c;订单被前台&#xff08;路由器&#xff09;接收并分发到各个厨房区域&#xff08;网络设备&#xff09;。光猫像是食材供应商&#xff0c;通过高效的物流系…

lua 游戏架构 之 游戏 AI (四)ai_autofight_find_target

定义一个名为 ai_autofight_find_target 的类&#xff0c;继承自 ai_base 类。 lua 游戏架构 之 游戏 AI &#xff08;一&#xff09;ai_base-CSDN博客文章浏览阅读237次。定义了一套接口和属性&#xff0c;可以基于这个基础类派生出具有特定行为的AI组件。例如&#xff0c;可…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del&#xff08;delete&#xff09; expire TTL Redis的key过期策略是怎么实现的&#xff1f; type get 和 set 连接到云服务器后&#xff0c;通过redis-cli命令进入到redis客户端…

设计模式--创建型

实现 #include <iostream> #include <memory>// 抽象产品类 class Product {public:virtual void Operation() const 0; };// 具体产品 类A class ConcreteProductA : public Product {public:virtual void Operation() const override {std::cout << &quo…

学术研讨 | 区块链治理与应用创新研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心组织&#xff0c;长安链开源社区支持的“区块链治理与应用创新研讨会”顺利召开&#xff0c;会议围绕区块链治理全球发展现状、研究基础、发展趋势以及区块链行业应用创新展开研讨。北京大学陈钟教授做了“区块链治理与应用创…