【详细实现】v1.0 随机点名应用

news2024/11/25 1:25:32

1.引言

  前面对这个应用的功能做了详细的分析(长什么样、能干什么),以先这样对一个项目最开始的分析成为需求分析,需求分析之后就是设计阶段。

  那么一般的项目,在设计阶段都需要干什么呢?在需求分析阶段确定需求后,设计阶段负责将需求转换为具体的系统设计方案。在这个阶段,开发团队会设计系统的整体结构、模块间的交互方式、数据存储方案等。设计阶段的目标是为开发团队提供一个清晰的指导方向,确保系统设计满足需求和性能要求。

  如上所知,我们的项目在设计阶段主要思考数据、模块功能相关的任务。那么在这个随机点名应用中,我们应该关注哪些内容呢?

  注意:上面的需求分析阶段、设计阶段是我们按照软件工程开发软件的过程进行划分的,这样的好处是让我们开发一个项目的时候思路更为清楚,这个阶段的划分也是程序员积累了大量经验之后

来划分的,注意前后关系:现有软件的开发、再有这些阶段方法的划分。那么我想和同学们表达的是,你在开发一个项目的时候,不要硬拗这个步骤,要针对你的项目具体来分析,这些专业名词是将我们的开发步骤高度凝练了,你在第一次学习项目的开发的时候,要多思考!思考自己去实现去完成这个项目该如何做!

  ok,再回到我们这个项目的设计中,需要关注数据、功能模块之间的交互。

前面我们简单写到:

          数据:程序内直接写入(集合或文件导入)
          界面:无特效、只显示

那么,接下来我们详细去思考如何处理。新建一个工程一起动手开始做吧!

2.数据来源与处理

2.1  ArrayList集合保存数据

方法一:直接用一个集合保存,在这里我们用新学到的ArrayList集合来保存我们的学生名字。

import java.util.ArrayList;

public class StudentListExample {
    public static void main(String[] args) {
        // 创建一个ArrayList来保存学生名字数据
        ArrayList<String> studentNames = new ArrayList<>();

        // 添加学生名字数据
        studentNames.add("张三");
        studentNames.add("李四");
        studentNames.add("王五");
        studentNames.add("赵六");

        // 打印输出学生名字数据
        System.out.println("学生名字列表:");
        for (String name : studentNames) {
            System.out.println(name);
        }
    }
}

在这里,我们可以看到用前面学习的add方法能够添加学生的名字到studentNames对象中,但是同学们发现这样一个个加名字的方式很麻烦!如果有200个学生,你也要写200行add()方法吗?所以,修改上面的这个代码,用前面学到的数组、循环的方式,将学生的数据加入studentNames 对象中。

先自己思考,如何实现,再参考以下代码:

如果你修改好了,点击这个链接看看参考代码如何写!

2.2  升级:使用文件导入数据保存到ArrayList集合

上面,大家可以发现是直接将数据写进程序里面的,在实际开发中,我们的数据往往是来源于文件:txt、csv等等,而且数据也是庞大的。那么有没有比较好的方法能让我们直接将准备好的文件数据导入进去呢?

首先,我们得准备一个名字文件。如截图所示:

在这里要注意到,我们保存名字的txt文件中,每一行保存一个名字,每一行的形式都是“编号。名字”来保存,那么我们在读取的时候应该对数据进行处理。(分割处理)

然后使用File类来读取文件:names.txt

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // 创建一个 ArrayList 对象来存储读取的中文名字
        ArrayList<String> chineseNames = new ArrayList<>();

        try {
            // 创建一个 File 对象,指向名为 "names.txt" 的文件
            File file = new File("names.txt");
            Scanner scanner = new Scanner(file);

            // 逐行读取文件内容
            while (scanner.hasNextLine()) {
                // 读取一行数据
                String data = scanner.nextLine();
                
                // 根据 "." 进行分割
                String[] parts = data.split("\\.");

                // 如果成功分割成两部分(数字和名字)
                if (parts.length == 2) {
                    // 获取名字部分并去除空格后存储到 ArrayList 中
                    String name = parts[1].trim();
                    chineseNames.add(name);
                }
            }

            scanner.close();

            System.out.println("读取的中文名字列表:");
            // 输出处理后的名字列表
            for (String name : chineseNames) {
                System.out.println(name);
            }

        } catch (FileNotFoundException e) {
            System.out.println("找不到文件");
            e.printStackTrace();
        }
    }
}

除此之外,大家还要注意文件的存取路径,names.txt应该放在你工程下面,如图所示。

将上面的代码测试运行,你的控制台上应该输出这样的内容:

由上可知,我们的名字无论是通过第一种还是第二种方式,都可以保存到对应的ArrayList类对象中。

3.核心点名功能的实现

现在数据有了,接下来是实现点名功能,那么怎么实现呢?

还记得前面学过的随机数类吗?Random类的核心方法再给大家回顾一下:

  1. nextInt(): 生成一个随机的整数,范围是整数的全部取值范围,包括负数和正数。

  2. nextInt(int bound): 生成一个随机的整数,范围是 [0, bound),即大于等于 0,小于 bound。

  3. nextLong(): 生成一个随机的长整数。

  4. nextDouble(): 生成一个随机的双精度浮点数,范围是 [0.0, 1.0),包括 0.0,不包括 1.0。

  5. nextFloat(): 生成一个随机的单精度浮点数,范围是 [0.0, 1.0),包括 0.0,不包括 1.0。

  6. nextBoolean(): 随机生成一个布尔值,即 true 或 false

  7. nextBytes(byte[] bytes): 生成随机的字节数组,填充给定的字节数组 bytes

  8. setSeed(long seed): 设置随机数生成器的种子,相同的种子将产生相同的随机序列。

那么,核心的点名功能该如何实现呢?大家动手尝试,采用Random类随机给我们的chineseNames这个里面的数据,随机选出一个。

代码很简单,简洁的写法只需要三行!

如果你动手尝试了,看一下这个参考代码吧。

运行程序,可以看到随机选取了一个名字!

4.交互界面的实现

4.1 交互界面类介绍

Swing 是 Java 提供的一套用于创建图形用户界面(GUI)的工具包。它提供了丰富的组件库,可以用于构建各种交互式和可视化的应用程序,如桌面应用程序、工具、游戏等。Swing 是 Java 提供的官方 GUI 工具包,因此具有很好的跨平台性,可以在不同操作系统上运行而无需对代码进行修改。

Swing 的特点包括:

  1. 组件丰富:Swing 提供了各种常用的 GUI 组件,如按钮、标签、文本框、列表框、下拉框、表格等,开发者可以通过组合这些组件来构建复杂的界面。

  2. 可定制性强:Swing 组件支持丰富的外观和行为定制,可以通过设置属性、样式、监听器等来实现界面的个性化设计。

  3. 事件驱动:Swing 使用事件驱动的模型,开发者可以为组件添加各种事件监听器,以便在用户交互时做出相应的处理。

  4. 跨平台性:Swing 是基于 Java 编写的,可以在不同操作系统上运行而无需修改代码。这使得开发者可以编写一次代码,就能在多个平台上部署应用程序。

  5. 轻量级:Swing 是一个轻量级的 GUI 工具包,不依赖于操作系统的 GUI 组件,而是使用 Java 绘制组件,因此具有较小的内存占用和启动时间.

Swing用法的简单展示

4.2 加入可视化界面

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ChineseNameGeneratorGUI extends JFrame {

    private JLabel nameLabel;
    private JButton generateButton;
    private ArrayList<String> chineseNames;

    public ChineseNameGeneratorGUI() {
        setTitle("随机点名");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 200);
        setLocationRelativeTo(null);  // 让窗口居中显示

        nameLabel = new JLabel("点击按钮生成随机名字");
        nameLabel.setHorizontalAlignment(SwingConstants.CENTER);  // 设置文本居中

        generateButton = new JButton("生成");

        generateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    File file = new File("names.txt");
                    Scanner scanner = new Scanner(file, "UTF-8");

                    chineseNames.clear();
                    while (scanner.hasNextLine()) {
                        String data = scanner.nextLine();
                        String[] parts = data.split("\\.");
                        if (parts.length == 2) {
                            String name = parts[1].trim();
                            chineseNames.add(name);
                        }
                    }
                    scanner.close();

                    Random random = new Random();
                    int randomIndex = random.nextInt(chineseNames.size());
                    String selectedName = chineseNames.get(randomIndex);

                    nameLabel.setText("随机选择的名字是:" + selectedName);

                } catch (FileNotFoundException ex) {
                    nameLabel.setText("找不到文件");
                    ex.printStackTrace();
                }
            }
        });

        chineseNames = new ArrayList<>();

        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(nameLabel, BorderLayout.CENTER);
        panel.add(generateButton, BorderLayout.SOUTH);

        add(panel);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ChineseNameGeneratorGUI();
            }
        });
    }
}

程序运行结果

5.IntelliJ IDEA来打包和发布Java程序

5.1 打包成可执行jar包

5.2 将jar包拷贝到桌面上,点击运行即可

如果你生成的jar文件到桌面变成压缩包,那么 你可以这样调试

或者采用此方法

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

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

相关文章

Linux系统中安装MySQL

1、在电脑中安装虚拟机 2、df -h查看光盘是否挂载&#xff0c;没挂载用mount -o ro /dev/sr0 /media命令挂载 3、进入etc/yum.repos.d目录查看仓是否配置&#xff0c;若配置进行下一一步&#xff0c;未配置则进行配置 配置软件仓库 [rootlocalhost yum.repos.d]# vim rhle.r…

423 世界读书日 和京东零售技术人一起读好书

我们正处于一个复杂、变化的世界&#xff0c;想要更好地理解、适应它&#xff0c;读书可能是最方便的方式之一。 4 月 23 日世界读书日&#xff0c;我们整理了 10 位零售技术人的书籍推荐给大家&#xff0c;欢迎大家一起来共读好书。愿大家在忙碌工作之余&#xff0c;都能够持…

Kubectl常见排查pod问题命令

一.查看命名空间pod及其日志 #查看命名空间pod kubectl get pods -n <命名空间名称> #该命令不加-n命名空间名称&#xff0c;默认是查看default命名空间的pod#查看对应pod的日志kubectl logs -f <pod-name> -n <namespace>#同样的如果查看的是default命名空…

在 vue3 中使用高德地图

前言&#xff1a;定位地图位置所需要的经纬度&#xff0c;可以通过 拾取坐标 获取。 一&#xff1a;快速上手 1. 安装依赖 npm install amap/amap-jsapi-loader # or pnpm add amap/amap-jsapi-loader # or yarn add amap/amap-jsapi-loader 2. 创建组件 src/components/Ma…

有关栈的练习

栈练习1 给定一个栈&#xff08;初始为空&#xff0c;元素类型为整数&#xff0c;且小于等于 109&#xff09;&#xff0c;只有两个操作&#xff1a;入栈和出栈。先给出这些操作&#xff0c;请输出最终栈的栈顶元素。 操作解释&#xff1a; 1 表示将一个数据元素入栈&#xff…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

一款辅助应用助力盲人公交出行畅行无阻

在这个日新月异的时代&#xff0c;科技进步正以前所未有的速度改变着人们的生活方式&#xff0c;尤其是在提升特殊群体生活质量方面展现出巨大潜力。今日&#xff0c;我们将目光聚焦于盲人公交出行&#xff0c;探讨一款名叫蝙蝠避障的创新辅助应用如何以其实时避障与拍照识别功…

vben admin Table 实现表格列宽自由拖拽

更改BasicTable.vue文件 Table添加 resize-column“resizeColumn” 添加并 return resizeColumn const resizeColumn (w, col) > { setCacheColumnsByField(col.dataIndex, { width: w }); }; 在column中添加 resizable: true,

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…

单机单实例部署RocketMQ及测试

部署Apache RocketMQ需要准备NameServer、Broker、Proxy三个组件。它有几种部署模式&#xff1a; Local模式:Broker 和 Proxy 是同进程部署Cluster模式:Broker 和 Proxy 分别部署 为了部署简便&#xff0c;我们采用local模式。 RocketMQ部署 Dockerfile FROM ubuntu:22.04 …

Linux KASAN使用与实现原理

一、KASAN工具使用 KASAN工具&#xff1a;Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具&#xff0c;主要功能是检查内存越界访问和使用已释放内存的问题。 1.1 KASAN宏控开关 KASAN有三种模式&#xff1a;1.通用KASAN&#xff1b;2.基于软件标签的KASAN&…

模版初阶【C++】

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

嵌入式Python基础1-2

嵌入式Python基础1-2 条件语句 if elif else 随机数random eval while循环 for循环 水仙花数 循环else list 列表常用方法 增删改查 加排序 append remove pop index() 升序sort(&#xff09;降序 sort(reverseTrue) 反转 reverse&#xff08;&#xff09;…

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…

持续更新。。。

1、JAVA面试指南 https://javaguide.cn/ 简历优化&#xff1a;突出与应聘职位相关的项目经验、技术栈、技能证书和专业成就。确保简历中的技术关键词与JD&#xff08;Job Description&#xff09;相符。 自我评估&#xff1a;对照目标职位要求&#xff0c;梳理自身Java技能树&…

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…

Xshell正版免费使用(学生党)

话不多说&#xff0c;上链接 https://www.xshell.com/zh/free-for-home-school/

Introducing Meta Llama 3: The most capable openly available LLM to date

要点 今天&#xff0c;我们推出 Meta Llama 3&#xff0c;这是我们最先进的开源大型语言模型的下一代。Llama 3型号将很快在AWS&#xff0c;Databricks&#xff0c;Google Cloud&#xff0c;Hugging Face&#xff0c;Kaggle&#xff0c;IBM WatsonX&#xff0c;Microsoft Azur…

Linux学习:文件描述符fd

目录 1. 引子2. C语言文件接口2.1 文件的打开与关闭的操作2.2 文件写入读取操作2.3 当前路径 3. 文件I/O操作与系统调用3.1 程序默认打开的文件流3.2 操作系统访问文件的系统调用接口3.2.1 文件打开与关闭操作3.2.2 写入与读取操作 4. 什么是文件描述符fd4.1 进程与文件的关系4…

【笔记】Telephony SIM SPN及运营商名称显示数据来源介绍

来源介绍 网络名称显示 来源及优先级&#xff08;高到低&#xff09; SourceCommentEnhanced Operator Name String(Eons) 名称信息存放&#xff1a; EF_PNN(PLMN Network Name, fid: 6FC5) &#xff1a;LAC和EF_PNN中的Record Identifier EF_OPL(Operator PLMN List, fid: 6FC…