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

news2024/9/20 22:34:15

文章目录

    • 代码实现
      • 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.coloradmin.cn/o/1947463.html

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

相关文章

【Stable Diffusion】(基础篇四)—— 模型

模型 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何下载和使…

C++【泛型编程】【string类常用接口】学习

目录 泛型编程 推演实例化 显示实例化 类模板 类模板的声明和定义分离 STL string string的构造和拷贝构造 选取特定字符串拷贝 解析&#xff1a; 关于npos的解析 验证 从一个字符串中拷贝前几个字符 解析&#xff1a; 注意&#xff1a; 验证&#xff1a; size…

AI应用行业落地100例 | 移民公司Envoy Global引入AI员工赋能,效率飙升80%,开启服务新篇章

《AI应用行业落地100例》专题汇集了人工智能技术在金融、医疗、教育、制造等多个关键行业中的100个实际应用案例&#xff0c;深入剖析了AI如何助力行业创新、提升效率&#xff0c;并预测了技术发展趋势&#xff0c;旨在为行业决策者和创新者提供宝贵的洞察和启发。 Envoy Globa…

Pytorch使用教学2-Tensor的维度

在PyTorch使用的过程中&#xff0c;维度转换一定少不了。而PyTorch中有多种维度形变的方法&#xff0c;我们该在什么场景下使用什么方法呢&#xff1f; 本小节我们使用的张量如下&#xff1a; # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …

【Unity PC端打包exe封装一个并添加安装引导】

Unity PC端打包exe封装一个并添加安装引导 比特虫在线制作ico图标ico图标转换工具 选中打包出来的所有文件和ico图标 右键 使用RAR软件 添加到压缩文件 两个名称要相同 设置完点击确认等待压缩完成 然后就可以使用 Smart Install Maker制作引导安装程序了

Matlab进阶绘图第64期—三维分组针状图

三维分组针状图可以看作是三维分组散点图的升级&#xff0c;能够直观地展示各组分、各元素的位置、对比情况。 由于Matlab中未收录三维分组针状图的绘制函数&#xff0c;因此需要大家自行设法解决。 本文使用自制的groupedstem3小工具进行三维分组针状图的绘制&#xff0c;先…

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装&#xff0c;配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…

华杉研发九学习日记17 正则表达式 异常

华杉研发九学习日记17 一&#xff0c;正则表达式 ^ $ 作用&#xff1a; 测试字符串内的模式(匹配) 例如&#xff0c;可以测试输入字符串&#xff0c;以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证. 替换文本&#xff08;替换》 可以使用正则表达式来…

知识工程经典语言 PROLOG基本介绍

定义 PROLOG语言是一种基于Horn子句的逻辑型程序设计语言&#xff0c;也是一种陈述性语言。 PROLOG的语句 PROLOG语言仅有三种语句&#xff0c;称为事实、规则和问题。 事实 格式 <谓词名>(<项表>). 其中谓词名是以小写英文字母开头的字母、数字、下划线等组成的…

使用js实现常见的数据结构---链表,队列,栈,树

注&#xff1a;本文只作为数据结构的实现参考和个人理解 链表 链表是由多个节点&#xff08;node&#xff09;连接起来的&#xff0c;每个节点包含了一些存储的数据和指向下一个节点的指针&#xff0c; 链表&#xff1a;多个连续的节点构成&#xff0c;节点&#xff1a;包含一…

spring-boot3.x整合Swagger 3 (OpenAPI 3) +knife4j

1.简介 OpenAPI阶段的Swagger也被称为Swagger 3.0。在Swagger 2.0后&#xff0c;Swagger规范正式更名为OpenAPI规范&#xff0c;并且根据OpenAPI规范的版本号进行了更新。因此&#xff0c;Swagger 3.0对应的就是OpenAPI 3.0版本&#xff0c;它是Swagger在OpenAPI阶段推出的一个…

大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

试过可道云teamOS的权限管理,才知道团队协作可以这么顺

在快节奏的工作环境中&#xff0c;团队协作的顺畅与否往往决定了项目的成败。作为团队中的一员&#xff0c;我深知权限管理在团队协作中的重要性。 我们的团队在协作过程中总是被权限问题所困扰。文件共享、资料访问、任务分配……每一个环节都需要小心翼翼地处理权限设置&…

学术研讨 | 区块链与隐私计算领域专用硬件研讨会顺利召开

学术研讨 近日&#xff0c;国家区块链技术创新中心主办&#xff0c;长安链开源社区支持的“区块链与隐私计算领域专用硬件研讨会”顺利召开&#xff0c;会议围绕基于区块链与隐私计算的生成式AI上链、硬件加速、软硬协同等主题展开讨论&#xff0c;来自复旦大学、清华大学、北京…

主题公园- 海豹主题式风格餐厅设计【AIGC应用】

业务背景&#xff1a;海洋馆针对细分客群增设一个打卡主题点位&#xff0c;以海豹主题式餐厅为打卡卖点&#xff0c;效果参见海豹主题式风格。 AIGC概念图制作平台&#xff1a;&#xff08;可灵&#xff09; https://klingai.kuaishou.com/ 关键词&#xff1a; 海豹主题餐厅…

机器学习 | 回归算法原理——随机梯度下降法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的多重回归继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享随机梯度下降法这一回归算法原理。本章的回归算法原理还是基于《基于广告费预测点击量》项目&#xff0c;欢迎大家交流学习&#xff01;…

Python 教程(二):语法与数据结构

目录 前言专栏列表语法特点实例代码基本数据类型变量命名规则赋值动态类型作用域示例代码 运算符list、set和dict 数据结构 区别1. list&#xff08;列表&#xff09;2. set&#xff08;集合&#xff09;3. dict&#xff08;字典&#xff09; 总结 前言 Python 是一种计算机编…

HarmonyOS实现跨语言交互(Node-API)

Node-API简介 通过Native接口&#xff0c;实现两种代码的交互。 是在Node.js提供的Node-API基础上扩展而来&#xff0c;但与Node.js中的Node-API不完全兼容。本质就是提供了对C/C代码的使用接口&#xff0c;使得两种代码共同工作。规范I/O、CPU密集型、OS底层等能力。 应用场景…

Python | Leetcode Python题解之第264题丑数II

题目&#xff1a; 题解&#xff1a; class Solution:def nthUglyNumber(self, n: int) -> int:dp [0] * (n 1)dp[1] 1p2 p3 p5 1for i in range(2, n 1):num2, num3, num5 dp[p2] * 2, dp[p3] * 3, dp[p5] * 5dp[i] min(num2, num3, num5)if dp[i] num2:p2 1if …