【详细实现】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,一经查实,立即删除!

相关文章

kubernetes部署控制器Deployment

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

惯性测量单元(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”串口输出

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

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

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 …

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

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

Golang操作Redis

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

助力实现更可持续未来的智能解决方案:AI如何改变世界

人工智能已然成为今年的热门话题。由于生成式AI应用的快速采用&#xff0c;新闻头条充斥着有关AI如何彻底改变我们的政策制定、就业和经济走向的预测。您知道AI也是我们应对各种可持续发展挑战的先锋吗&#xff1f;AI通过分析大量数据&#xff0c;并提供有用的见解和工具&#…

【Unity动画系统】Animator组件的属性

介绍Animator组件的全部属性 Controller&#xff1a;动画控制器 Avatar&#xff1a;人物骨骼 Apply Root Motion&#xff1a;有一些动画片段自带位移&#xff0c;如果希望自带的位移应用在游戏对象上&#xff0c;那么就勾选&#xff1b;如果自己编写脚本&#xff0c;那么就不…

【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考&#xff1a; 【课程笔记】南大软件分析课程8——指针分析-上下文敏感&#xff08;课时11/12&#xff09; - 简书 ------------------------------------------------------------------------------------------------------------- 1. 上下文不敏感的问题 说明&#…

C# 图像处理 添加水印

方法1&#xff0c;使用自带的画刷进行绘制水印 示例代码 public partial class Form1 : Form{public Form1(){InitializeComponent();}string photoPathstring.Empty;Bitmap image null;private void button1_Click(object sender, EventArgs e) //选择照片{OpenFileDialog d…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…

全志ARM-官方库SDK安装和验证

进入界面&#xff0c;输入以下指令 git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build …

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

前端JS必用工具【js-tool-big-box】,防抖和节流的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是防抖和节流方面的。 目录 前言 1 安装和引入 2 防抖的调用学习 3 节流的调用学习 4 使用方法总结 前言 在前端项目中&#xff0c;经常涉及到防抖…

多数据源注解使用

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 1.使用mybatis-plus 如何配置多数据源&#xff0c;application-loc…