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.mzph.cn/web/49544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

力扣第三十七题——解数独

内容介绍 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数独…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

VIM基础配置

1. CTAGS配置 下载 上传虚拟机&#xff0c;解压&#xff0c;进入目录 tar -xzvf ctags-5.8.tar.gz cd ctags-5.8/编译 ./configure sudo make sudo make install查看是否安装成功 ctags --version打印如下 2. 使用Vundle 下载 git clone https://github.com/VundleVim/Vund…

Linux并发程序设计(3):守护进程

目录 前言 一、介绍 1.1 概念 1.2 特点 1.3 举例 二、系统编程 2.1 setsid函数 2.2 getpid函数 2.3 getsid函数 2.4 getpgid函数 2.5 chdir函数 三、代码例程 3.1 使子进程在后台运行 3.2 使子进程脱离原终端 3.3 更换目录&#xff0c;并设定权限&#xff08;非…

基于STM32通过云平台实现智慧大棚【手机远程查看温湿度】【报警】

文章目录 一、成果演示二、所用到的模块三、实现的功能四、接线说明五、WIFI模块配置步骤5.1云平台介绍5.2云平台使用5.3使用USB转TTL测试联通云平台 六、STM32代码编写七、手机上查看数据6.1下载软件&#xff08;仅限安卓手机&#xff09;6.2操作 一、成果演示 STM32通过物联网…

String、StringBuffer和StringBuilder

一、String类 1. String类的理解 2. String类结构 1. String类实现了Serializable接口,说明String对象可以串行化,即可以在网络上传输 2. String类实现了Comparable接口,说明String对象可以比较 String底层是一个字符数组,这个数组里存的是字符串的内容 例如:…

005 仿muduo实现高性能服务器组件_通信连接管理

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f4d2;代码仓库&#xff1a; 项目代码 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言Channel模块设计原因整体设计代码如下 Connection模块设计原…

Florence2:Advancing a unified representation for a variety of vision tasks

Florence-2模型:开启统一视觉基础模型的新篇章_florence -2-CSDN博客文章浏览阅读1.1k次,点赞108次,收藏109次。Florence-2是由微软Azure AI团队开发的一款多功能、统一的视觉模型。它通过统一的提示处理不同的视觉任务,表现出色且优于许多大型模型。Florence-2的设计理念是…

用Postman Flows打造你的专属API:外部公开,轻松上手!

引言 Postman Flows 是一个使用 GUI 进行无代码 API 调用流程创建的服务。这篇文章我尝试使用 Flows 来构建将 Momento Topic 中的数据保存到 TiDB 的保存 API&#xff0c;因此想分享一些使用过程中的技巧等。 实现内容 将从 Momento Topics 配发的 JSON 数据保存到 TiDB 中。…

C++ 栈( stack )学习

目录 1.栈 2.模拟栈 1.1.入栈( push ) 1.2.出栈( pop ) 1.3.获取栈顶元素( top ) 3.直接使用栈( stack ) 3.1.导入头文件并创建栈 3.2.栈的操作 3.2.1.入栈( push ) 3.2.2.出栈( pop ) 3.2.3.获取栈顶元素( top ) 3.2.4.获取栈中元素个数( size ) 3.2.5.判断栈是否…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网&#xff1a;54.替换数字思路复习&#xff1a;字符串 vs 数组 总结 今天是字符串专题的第一天&#xff0c;主要是一些基础的题目 344.反转字符串 建议&#xff1a; 本题是字符串基础题目&#xff0c;就是考察 revers…

docker挂载部署reids6.2.1

1.拉取镜像 docker pull redis:6.2.12.创建挂在目录&#xff08;根据自己要求修改具体目录&#xff09; mkdir -p /home/admin/redis/{data,conf}3.在/home/admin/redis/conf目录下创建redis.conf文件 cd /home/admin/redis/conf touch redis.conf4.复制下面文本到redis.conf…

浅析JWT原理及牛客出现过的相关面试题

原文链接&#xff1a;https://kixuan.github.io/posts/f568/ 对jwt总是一知半解&#xff0c;而且项目打算写个关于JWT登录的点&#xff0c;所以总结关于JWT的知识及网上面试考察过的点 参考资料&#xff1a; Cookie、Session、Token、JWT_通俗地讲就是验证当前用户的身份,证明-…

不断把别人“装”进我们的灵魂口袋

嘿&#xff0c;朋友们&#xff01;今天我们来聊聊一种超酷的能量——本色示人。这不是什么秘密武器&#xff0c;但它比任何超能力都来得实在。 第一部分&#xff1a;本色示人&#xff0c;能量界的“超级赛亚人” 1.1 坦诚的超能力 想象一下&#xff0c;如果你的内心强大到可以…

Window部署Ollama+Qwen2.0+Open-WebUI

文章目录 Windows下安装Docker安装Docker检查是否安装成功, 出现版本即为安装成功安装Ollama启动 Ollama 并拉取模型(选做) 修改默认地址和端口(选做) Ollama 进行跨域配置安装open-webui Windows下安装Docker 准备条件 开启Hyper-V&#xff0c;在“启用或关闭Windows功能”里…

C语言 #指针数组 #数组指针 #数组参数、指针参数

文章目录 前言 一、指针数组 1、概念&#xff1a; 2、指针数组有什么用呢&#xff1f; 二、数组指针 1、数组指针的定义 2、数组名与 &数组名 的区别 3、数组指针如何初始化&#xff1f; 4、数组指针的用法 三、根据代码区分 指针数组 和 数组指针 四、数组参数、指针参数 …

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式&#xff08;BRE&#xff09; 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut&#xff1a;列截取工具 2.sort排序 …

【Android】使用ViewPager2与TabLayout实现顶部导航栏+页面切换

【Android】使用ViewPager2与TabLayout实现顶部导航栏&#xff0b;页面切换 TabLayout与ViewPager2概述 TabLayout TabLayout 是 Android 支持库中的一个组件&#xff0c;它是 Design 支持库的一部分。TabLayout 提供了一个水平的标签页界面&#xff0c;允许用户在不同的视图…

CogVideo 实测,智谱「清影」AI视频生成,全民免费,连 API 都开放了!

不得不说&#xff0c;AI 视频生成界最近非常火热~ 前有快手「可灵」开放内测&#xff0c;一下子带火了老照片修复&#xff0c;全网刷屏&#xff1a; 怕是你还没拿到内测资格&#xff0c;被称为 “国货之光” 的「可灵」就结束了免费无限量模式。每天只有66点的免费额度&#x…