0

0

在Java中如何实现控制台版购物车_Java初级项目实战解析

P粉602998670

P粉602998670

发布时间:2026-02-01 10:50:02

|

864人浏览过

|

来源于php中文网

原创

基础购物车用ArrayList存商品、Scanner接收输入,需封装Product类(含id/name/price/quantity),重写equals()/hashCode(),用序号删除、价格用int存分单位、输入后调nextLine()清缓存,总价格式化输出。

在java中如何实现控制台版购物车_java初级项目实战解析

怎么用 Scanner + ArrayList 搭出基础购物车结构

控制台购物车本质是内存中的数据管理,不需要数据库或 Web 框架。核心就是用 ArrayList 存商品,用 Scanner 接收用户输入。别一上来就搞类图或 MVC 分层——先跑通“加商品→查清单→删一项→算总价”这四个动作。

关键点在于:商品最好封装成独立类(比如 Product),至少含 idnamepricequantity 四个字段;购物车本身用 ArrayList,而不是存字符串或数组。否则后续修改数量、按 ID 查找会非常痛苦。

常见错误:
• 把价格用 int 存(导致 9.9 元变成 9 元)→ 改用 double 或更稳妥的 BigDecimal(初级项目用 double 即可)
• 每次添加都 new 一个新 Product,但没重写 equals() → 后续删商品时用 list.remove(product) 失败
Scanner 读完数字后没调 nextLine() 清缓存 → 下一次 nextLine() 直接返回空字符串

怎么处理用户反复输入和菜单跳转逻辑

控制台交互最易崩的地方不是功能,而是输入流错乱。别用一堆 if-else if 堆菜单,用 while (true) + switch 主循环更清晰。每次循环开头先打印菜单,结尾统一用 scanner.nextLine() 吃掉换行符。

立即学习Java免费学习笔记(深入)”;

实操建议:
• 输入选项用 scanner.nextInt(),但之后立刻跟 scanner.nextLine()
• 所有字符串输入(如商品名)统一用 scanner.nextLine().trim(),避免空格导致匹配失败
• 输入非法数字时,hasNextInt() 比直接 try-catch 更轻量;如果用户输 “abc” 再输 “1”,不清理输入缓冲区会导致死循环
• 退出选项设为 0 或 “quit”,在 switch 外围用 break outer; 或设标志位 running = false

怎么安全地从购物车删除指定商品

初学者常写 cart.remove(product),结果删不掉——因为两个 Product 对象内存地址不同,即使字段一样,equals() 默认比较的是引用。必须重写 equals()hashCode(),且至少基于 id 判断相等性。

快转字幕
快转字幕

新一代 AI 字幕工作站,为创作者提供字幕制作、学习资源、会议记录、字幕制作等场景,一键为您的视频生成精准的字幕。

下载

更实用的做法(尤其对初级项目):
• 提供按序号删除:遍历 cart,用 for (int i = 0; i ,打印时带上 i + 1 作为序号
• 用户输入序号 n,校验 n > 0 && n ,然后 cart.remove(n - 1)
• 避免用商品名删除(重名情况难处理),也别用价格删(多个商品同价很常见)
• 删除后记得提示“已移除:xxx”,并立即调用显示清单方法,让用户确认

为什么结算时总价总是不对?浮点精度和累加陷阱

double price = 29.99; 累加多次后输出可能是 89.96999999999999。这不是 bug,是二进制浮点数表示局限。初级项目不用上 BigDecimal,但至少得格式化输出

System.out.printf("总计:¥%.2f\n", total);

但注意:printf 只影响显示,不修正计算过程。如果要做“满 100 减 10”这类判断,不能写 if (total >= 100.0),而应写 if (Math.abs(total - 100.0) 100.0),或更简单——所有价格内部乘 100 存 int(如 2999 表示 29.99 元),运算完再除 100.0 输出。后者对初学者更可控,也避开了 BigDecimal 的构造参数陷阱(比如 new BigDecimal(29.99) 实际是 29.989999999999998...)。

真正容易被忽略的是:用户反复添加同一商品时,应该合并数量而非新增一条记录。这需要在添加前遍历检查 cart 中是否存在相同 id 的商品——这里又回到必须重写 equals() 的问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

785

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

543

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

424

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

75

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

286

2023.11.28

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

119

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

258

2025.10.24

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.2万人学习

Java 教程
Java 教程

共578课时 | 54.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号