Java基础结课题-统计双色球中奖数
目录
案例要求:
实现思路:
代码:
四、总结(升华代码意义)
案例要求:
这道题是围绕双色球号码设计的编程实践题目,核心要实现两个功能:
1. 随机生成符合规则的双色球号码
- 按规则生成 6 个 不重复 的红球(范围 1-35),并对红球升序排序;
- 生成 1 个篮球(范围 1-15),最终按 “红球 + 篮球” 的格式输出完整号码。
2. 模拟中奖校验逻辑
- 给定一组 “中奖号码”(题目示例图里的红球 + 篮球);
- 拿随机生成的号码与中奖号码对比,统计 红球命中个数 和 篮球命中个数,判断中奖情况。
简单说,就是让你用代码模拟双色球的「随机出票」和「中奖核对」流程,既练随机数、集合操作,也涉及业务规则(去重、排序、范围约束)和逻辑校验,很适合用来写 “编程趣味实践”“小功能开发思路” 类的博客,能结合彩票规则讲代码逻辑~
实现思路:
使用TreeSet集合,该集合特性是不重复
代码:
package com.itheima.demo1;import java.util.Collections;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;public class test1 {public static void main(String[] args) {Set<Integer> target=new TreeSet<>();Collections.addAll(target,10,12,30,16,7,17);int blueTarget=12;Scanner sc=new Scanner(System.in);Set<Integer> user=new TreeSet<>();while (user.size()<6) {System.out.println("请输入选择的红球的数字");int num=sc.nextInt();if(num<1||num>35){System.out.println("请输入1-35之间的红球数");}elseuser.add(num);}int blueUser=0;while (true){System.out.println("请输入选择的篮球的数字");int num=sc.nextInt();if(num<1||num>15){System.out.println("请输入1-15之间的数字");}else{blueUser=num;break;}}int count=0;for(int val:user){if(target.contains(val)){count++;}}System.out.println("用户中红球"+count+"个");count=blueUser==blueTarget?1:0;System.out.println("用户中篮球"+count+"个");}
}
以下从代码结构、功能逻辑、细节设计等维度,全方位深度讲解这段双色球模拟程序,帮你理解每行代码的意义与价值:
一、整体功能定位
这段 Java 代码实现了模拟双色球「用户选号 - 与预设中奖号码对比」的核心流程,让用户手动输入 6 个红球(1-35,不重复)和 1 个蓝球(1-15),然后与程序预设的中奖号码比对,统计红球、蓝球的命中数量。既模拟了真实双色球的选号规则,也实现了基础的中奖校验逻辑,是对「数据录入 - 规则校验 - 结果统计」流程的完整实践。
二、代码模块拆解与详解
1. 中奖号码初始化:构建比对 “基准”
java
运行
Set<Integer> target = new TreeSet<>();
Collections.addAll(target, 10, 12, 30, 16, 7, 17);
int blueTarget = 12;
- 数据结构选型(TreeSet):
用TreeSet
存储 6 个红球中奖号码,利用其自动排序、去重特性,既契合 “红球需有序(虽然题目要求用户红球升序,但中奖号码用 TreeSet 存储可保证有序,方便后续对比)” 的隐含需求,也避免手动维护排序逻辑。 - 功能意义:
target
作为红球中奖号码容器,blueTarget
作为蓝球中奖号码,共同构成 “中奖基准”,后续用户输入的号码都要与这两个数据比对,判断是否中奖。
2. 用户交互初始化:准备接收输入
java
运行
Scanner sc = new Scanner(System.in);
Set<Integer> user = new TreeSet<>();
- Scanner 作用:
实例化Scanner
,从控制台获取用户输入,是 Java 实现 “人机交互” 的基础工具。 - 用户选号容器(TreeSet):
同样用TreeSet
存用户红球选号,利用其自动去重特性,若用户输入重复数字(如连续输两次 10),集合会自动过滤,无需手动写去重逻辑,简化代码同时契合 “红球不重复” 规则。
3. 用户红球选号逻辑:规则校验与录入
java
运行
while (user.size() < 6) {System.out.println("请输入选择的红球的数字");int num = sc.nextInt();if (num < 1 || num > 35) {System.out.println("请输入1-35之间的红球数");} else user.add(num);
}
- 循环控制(while (user.size () < 6)):
要求用户必须输入 6 个有效红球,若数量不足则持续循环,保证 “6 个红球” 的规则被严格执行。 - 合法性校验(if (num < 1 || num> 35)):
限定用户输入范围,若超出1-35
则提示重新输入,确保输入符合双色球 “红球号码范围” 规则,是业务规则落地的关键校验点。 - 自动去重(user.add (num)):
依赖TreeSet
的去重特性,若用户输入重复数字(如先输 10 再输 10),集合不会重复存储,天然满足 “红球不重复” 需求,无需额外写去重判断。
4. 用户蓝球选号逻辑:循环校验直至合规
java
运行
int blueUser = 0;
while (true) {System.out.println("请输入选择的篮球的数字");int num = sc.nextInt();if (num < 1 || num > 15) {System.out.println("请输入1-15之间的数字");} else {blueUser = num;break;}
}
- 死循环 + break 设计:
用while (true)
构建 “必循环” 逻辑,强制用户输入蓝球,直到输入1-15
范围内的数字才通过break
跳出循环。相比固定次数循环,这种设计更灵活、更贴合 “必须输入合规值” 的强校验场景。 - 变量赋值(blueUser = num):
一旦输入合规,将值赋给blueUser
,作为用户蓝球选号结果,供后续中奖校验使用。
5. 中奖校验与结果输出:核心业务逻辑
java
运行
int count = 0;
for (int val : user) {if (target.contains(val)) {count++;}
}
System.out.println("用户中红球" + count + "个");count = blueUser == blueTarget ? 1 : 0;
System.out.println("用户中篮球" + count + "个");
- 红球命中统计(for 循环):
遍历用户红球选号(user
),逐个与中奖红球(target
)比对,用target.contains(val)
判断是否命中,命中则count
自增。通过遍历 + 集合查询,简洁实现 “多对多比对”,统计命中数量。 - 蓝球命中统计(三元运算符):
用三元运算符blueUser == blueTarget ? 1 : 0
,一行代码完成 “命中则计 1,否则计 0” 的逻辑,相比if-else
更简洁。 - 结果输出:
分别打印红球、蓝球命中数量,将业务结果直观呈现给用户,完成 “选号 - 比对 - 反馈” 的完整闭环。
6. 代码潜在优化点(可拓展讲解)
- 用户体验优化:
若用户输入重复数字(虽 TreeSet 去重,但程序未提示 “该数字已选”),体验略有不足,可在else
分支(user.add(num)
前)加提示,如System.out.println("该数字已选,请重新输入");
。 - 边界场景覆盖:
若用户输入非数字(如字母、符号),sc.nextInt()
会抛InputMismatchException
,需用try-catch
或hasNextInt()
校验,增强程序鲁棒性。 - 功能拓展性:
中奖号码目前写死在代码里,可改为从文件、数据库读取,或随机生成(贴合题目 “随机一组号码” 的原始需求),让程序更灵活、贴近真实场景。
三、代码设计亮点与价值
1. 巧妙利用数据结构特性
- 用
TreeSet
同时解决 “去重、排序” 需求,减少手动逻辑,让代码更简洁、高效。无论是中奖号码存储,还是用户选号录入,都利用其特性规避重复开发。
2. 分层实现业务逻辑
- 从 “初始化(中奖号码、交互工具)”→“用户输入(红球、蓝球)”→“中奖校验(遍历比对)”→“结果输出”,流程清晰,符合 **“单一职责原则”**,每个模块专注做一件事,代码易读、易维护。
3. 贴合真实业务规则
- 严格遵循双色球 “红球 1-35、蓝球 1-15,红球不重复” 的规则,通过数据结构(TreeSet)、条件判断(
if (num < 1 || num > 35)
)落地业务约束,是 “业务逻辑转代码规则” 的典型实践。
四、总结(升华代码意义)
这段代码虽短小,但完整覆盖 **“需求分析(理解双色球规则)→ 技术选型(TreeSet、Scanner 等)→ 逻辑实现(输入校验、中奖比对)→ 结果呈现”** 的开发流程,是 “小需求驱动编程实践” 的优质案例。
本文介绍了一个Java实现的双色球号码模拟程序,包含随机选号和中奖校验两大功能。程序使用TreeSet存储红球确保不重复且自动排序,通过Scanner实现用户交互,严格校验输入范围(红球1-35,蓝球1-15)。核心逻辑通过集合比对统计命中数,完整实现了"选号-校验-反馈"的闭环流程。代码巧妙利用数据结构特性简化业务规则实现,展现了基础语法解决实际问题的能力,既遵循彩票规则又体现分层设计思想,是业务逻辑转代码的典型范例。
它不仅教你如何用 Java 基础语法(循环、条件判断、集合操作)解决实际问题,更传递了 **“利用数据结构简化逻辑”“强规则场景下的校验设计”“人机交互的流程闭环”** 等编程思维,对理解 “业务需求转代码实现” 有很高的学习价值,也适合作为 “小功能开发剖析” 的博客素材,从代码细节延展到编程思路、设计哲学,丰富博客内容~