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

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() {@Overridepublic 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() {@Overridepublic void run() {new ChineseNameGeneratorGUI();}});}
}

程序运行结果

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

5.1 打包成可执行jar包

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

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

或者采用此方法

5.3 打包成exe发布

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

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

相关文章

Spring Cloud Eureka面试题

Spring Cloud Eureka面试题 1. Eureka基础概念1.1 什么是Eureka&#xff1f;1.2 Eureka的组件和架构有哪些元素组成&#xff1f;1.3 Eureka Server和Eureka Client有什么区别&#xff1f;1.4 如何描述Eureka的自我保护机制&#xff1f; 2. 服务注册与发现2.1 如何将服务注册到E…

[C++][算法基础]数字三角形(动态规划)

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 88 1 02 7 4 4 4 5 2 6 …

c++ 智能指针 交换函数实验

1.概要 c 智能指针 交换函数实验 交换后&#xff0c;两个指针管理的目标对象会发生交换 sh_ptr1.swap(sh_ptr2); 2.代码 #include <iostream> using namespace std;int main() {shared_ptr<int> sh_ptr1 std::make_shared<int>(5);shared_ptr<int>…

【c++基础】求细胞数量

说明 一矩形阵列由数字 0 到 9 组成&#xff0c;数字 1 到 99 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞&#xff0c;求给定矩形阵列的细胞个数。 输入数据 第一行两个整数代表矩阵大小 n 和 m。 接下来 n 行&#xff0c;每行一个长度…

kubernetes部署控制器Deployment

一、概念 在学习rc和rs控制器资源时&#xff0c;这两个资源都是控制pod的副本数量的&#xff0c;但是&#xff0c;他们两个有个缺点&#xff0c;就是在部署新版本pod或者回滚代码的时候&#xff0c;需要先apply资源清单&#xff0c;然后再删除现有pod&#xff0c;通过资源控制&…

华为 obs相关

obd配置 hw-obs:endpoint: ak: sk: bucketname:获取桶列表 public class HwObsController {Value("${hw-obs.ak}")private String hwObsAk;Value("${hw-obs.sk}")private String hwObsSk;Value("${hw-obs.endPoint}")private String hwObsEndp…

惯性测量单元(IMU)CAN接口:M-G552PJ7

M-G552PJ7是一种小形状因子惯性测量单元&#xff08;IMU&#xff09;&#xff0c;具有6个自由度&#xff1a;三轴角率和线性加速度&#xff0c;利用高精度补偿技术提供高稳定性和 高精度的测量能力。 各种校准参数存储在IMU的内存中&#xff0c;并在IMU的电源被打开后自动反映在…

python项目练习-1

获取无忧书城的小说内容&#xff01; import requests # 导入请求包 from lxml import etree # 导入处理xml数据包url https://www.51shucheng.net/wangluo/douluodalu/21750.html book_num 1 # 文章页数 download_urls [] # 定义一个空列表&#xff0c;表示我们下载过小…

如何使用bof-launcher在CC++Zig应用程序中执行Beacon对象文件(BOF)

关于bof-launcher bof-launcher是一款针对Beacon对象文件&#xff08;BOF&#xff09;的安全测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以轻松在C/C/Zig应用程序中执行Beacon对象文件&#xff08;BOF&#xff09;。 Cobalt Strike 4.1于2020年6月25日发…

Checkpoint机制和生产配置

1.前提 在将Checkpoint之前&#xff0c;先回顾一下flink处理数据的流程&#xff1a; 2. 概述 Checkpoint机制&#xff0c;又叫容错机制&#xff0c;可以保证流式任务中&#xff0c;不会因为异常时等原因&#xff0c;造成任务异常退出。可以保证任务正常运行。 &#xff08;1&…

全志ARM-修改开发板内核启动日志

修改开发板内核日志输出级别&#xff1a; 默认输出级别为1&#xff0c;需要用超级用户权限修改 sudo vi /boot/orangepiEvn.txt 把第一行内核启动输出权限改为7&#xff0c;第二行把输出方式该为“serial”串口输出

后端面试真题--计算机基础篇

计算机基础 1、计算机网络&#xff08;常考&#xff09;2、操作系统3、数据结构4、Linux二级目录三级目录 1、计算机网络&#xff08;常考&#xff09; 1、介绍一下网络七层架构&#xff0c;TCP/IP的四层架构&#xff0c;每一层都有什么协议 2、讲讲TCP/IP的流量控制和拥塞控制…

前端实现将二进制文件流,并下载为excel文件

目录 一、关于二进制流二、项目实践三、常见问题及解决 一、关于二进制流 含义&#xff1a;二进制流是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同。 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频…

机器学习笔记 - scikit-learn中的metric参数和metric_params参数如何使用?

在 scikit-learn 库中的一些算法里面,这里是指需要使用距离度量或相似度度量的算法,这里拿KNeighborsclassifier举例来说,会有metric参数,这个参数用于指定距离度量方法。这个参数有多个可选项,常用的有以下几种: 1.euclidean:欧氏距离。这是默认的距离度量方法。 2.manha…

c++输入年月日,计算是该年的第几天

直接把每个月的天数存到数组直接相加会很方便&#xff0c;不用过多的判断。 注意&#xff1a;润年判断方法&#xff08;可以被4整除但不能被100整除&#xff0c;或者可以被400整除&#xff09; #include <iostream> using namespace std;int main() {int year,month,da…

PyCharm 中的特殊标记

在使用 PyCharm 开发 Python 项目的时候&#xff0c;经常会有一些特殊的标记&#xff0c;有些是 IDE 提示的代码规范&#xff0c;有些则为了方便查找而自定义的标记。 我在之前写过一些关于异常捕获的文章&#xff1a;Python3 PyCharm 捕获异常报 Too broad exception clause …

LeetCode——滑动窗口

滑动窗口 包含特定元素的子串&#xff08;要匹配到的目标&#xff09;&#xff0c;或最长[这个好像没啥意思]、或最短、或等长 思考&#xff1a;&#xff08;暂时感受&#xff09; 1&#xff09;什么时候扩充窗口——串没走完就得扩呀&#xff1b; 2&#xff09;窗口扩充后…

2024年Java JDK下载安装教程,附详细图文

文章目录 简介一、JDK的下载二、JDK的安装三、设置环境变量(不一定需要执行&#xff09; 简介 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f34…

4D Solver

好的,我将详细解释一下4D Solver是如何将视频、深度数据与MetaHuman人物表情网格数据相结合的: 4D Solver实际上是一种先进的计算机视觉算法,它能将2D视频图像数据与3D几何网格数据相匹配和对齐。 具体过程分为以下几个步骤: 标定(Calibration) 首先需要对捕捉设备(iPhone或…

Golang操作Redis

一. Redis介绍 1.1 简介 Redis是完全开源免费的&#xff0c;遵循BSD协议&#xff0c;是一个高性能的key-value数据库。 Redis与其它的key-value缓存产品有以下三个特点&#xff1a; Redis支持数据持久化&#xff0c;可以见内存中的数据报错在磁盘中&#xff0c;重启的时候可以…