欢迎光临
我们一直在努力

电影管理系统案例

一、题目需求

(一)、整体解题思路框架

这段电影管理系统代码的核心思路是面向对象 + 数据容器 + 交互逻辑三层架构,本质是模拟一个轻量级的本地电影信息管理工具,核心目标是实现 “上架、查询、删除” 的基础 CRUD(创建、读取、更新、删除)功能。

(二)、分模块解题思路详解

1. 第一步:数据建模(Movie 实体类)
  • 核心思路:用面向对象思想封装电影的核心属性,让 “电影” 成为可操作的独立对象。
  • 具体实现:
    • 提取电影的核心特征:ID(唯一标识)、名称、优惠价、其他信息,作为类的私有属性;
    • 提供构造方法(用于创建电影对象)和 Getter/Setter(用于访问 / 修改属性);
    • 重写toString()方法(方便直接打印电影信息,无需手动拼接字符串)。
  • 设计目的:将电影的 “数据” 和 “行为” 封装,符合面向对象的封装原则,后续操作直接对Movie对象进行,而非零散的变量。
2. 第二步:数据存储(ArrayList 容器)
  • 核心思路:选择ArrayList作为存储电影对象的容器,满足 “动态增删、遍历查询” 的需求。
  • 关键设计:
    • 声明private ArrayList<Movie> movieList,限定为私有属性,避免外部直接修改数据;
    • 新增nextId自增变量:解决 “删除电影后 ID 重复” 的问题(若直接用movieList.size()+1生成 ID,删除后再上架会出现 ID 重复),保证每个电影 ID 唯一。
  • 选择原因:ArrayList支持动态添加 / 删除元素,遍历效率高,完全匹配 “本地临时存储” 的需求(无需持久化到文件 / 数据库)。
3. 第三步:交互逻辑(菜单 + 用户输入)
  • 核心思路:通过 “循环菜单 + Scanner 输入” 实现用户与程序的交互,让用户自主选择功能。
  • 具体实现:
    • showMenu()方法:用while(true)实现循环菜单,用户不选 “退出” 则一直停留在操作界面;
    • 输入处理:
      • 用sc.nextInt()接收用户的功能选择,sc.nextLine()处理换行符(避免nextDouble()/nextInt()后读取空字符串);
      • 对非数字输入增加try-catch异常处理(比如用户输入字母代替数字),防止程序崩溃。
  • 设计目的:模拟真实系统的交互体验,降低用户操作门槛,同时保证程序稳定性。
4. 第四步:核心功能实现(上架 / 查询 / 删除)
(1)上架电影(addMovie ())
  • 思路:接收用户输入→验证输入合法性→创建电影对象→存入容器→反馈结果。
  • 关键步骤:
  • 接收用户输入的名称、价格、其他信息;
  • 对价格做数字校验(避免输入非数字);
  • 用nextId++生成唯一 ID,创建Movie对象;
  • 将对象添加到movieList,并提示上架成功。
(2)查询功能(showAllMovies () + findMovieById ())
  • 思路:分 “全量查询” 和 “精准查询”,先判断数据是否为空,再遍历容器处理。
    • 全量查询:直接遍历movieList,打印所有电影对象(依赖重写的toString());
    • 精准查询:接收用户输入的 ID→遍历容器匹配 ID→找到则输出信息,未找到则提示。
  • 设计细节:先判断movieList.isEmpty(),避免遍历空集合,同时给用户友好提示(如 “暂无电影,请先上架”)。
(3)删除电影(deleteMovieById ())
  • 思路:按 ID 精准删除,遍历容器匹配 ID→找到则移除元素→反馈结果。
  • 关键步骤:
  • 先判断集合是否为空,避免无效操作;
  • 用for(int i=0; i<movieList.size(); i++)遍历(而非增强 for),因为增强 for 遍历中不能修改集合(会抛异常);
  • 匹配 ID 后用movieList.remove(i)删除元素,并用return终止遍历(避免继续循环)。
5. 第五步:异常处理与用户体验优化
  • 核心思路:预判用户可能的错误操作,提前处理,避免程序崩溃,同时提升交互友好性。
  • 具体优化点:
    • 输入非数字(如价格、ID)时,用try-catch捕获异常,提示用户重新输入;
    • 所有功能先判断集合是否为空,避免空指针或无效遍历;
    • 操作后给出明确反馈(如 “删除成功”“未找到该 ID 电影”),而非无提示。

二、完整代码示例

代码一:电影类

package com.sy.movie;
/**
* 电影类
*/
public class Movie {
// 电影ID
private int id;
// 电影名称
private String name;
// 电影优惠价格
private double price;
// 电影其他信息
private String info;

// 无参构造
public Movie() {
}

//有参构造
public Movie(int id, String name, double price, String info) {
this.id = id;
this.name = name;
this.price = price;
this.info = info;
}

//Getter和Setter方法

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public String getInfo() {
return info;
}

public void setInfo(String info) {
this.info = info;
}

//重写toString方法,方便打印菜品信息
@Override
public String toString() {
return "【ID:" + id + "】" + name + "\\n" +
"信息:" + info + "\\n" +
"价格:¥" + price + "\\n" +
"————————";
}
}

代码二:电影管理类

package com.sy.movie;

import java.util.ArrayList;
import java.util.Scanner;

/**
* 电影管理类
*/
public class MovieManage {
// 存储所有的电影集合
private ArrayList<Movie> movieList = new ArrayList<>();
// 扫描器,用于接收用户输入
private Scanner sc = new Scanner(System.in);
// 自增ID(解决删除后ID重复问题)
private int nextId = 1;

// 展示操作界面
public void showMenu() {
while (true) {
System.out.println("\\n===== 电影管理系统 =====");
System.out.println("1. 上架电影");
System.out.println("2. 浏览所有电影");
System.out.println("3. 根据id查询电影");
System.out.println("4. 根据id删除电影");
System.out.println("5. 退出系统");
System.out.print("请输入您的选择:");

// 处理非数字输入的异常
int choice;
try {
choice = sc.nextInt();
sc.nextLine(); // 吞掉换行符
} catch (Exception e) {
System.out.println("请输入数字(1-5)!");
sc.nextLine(); // 清空错误输入
continue;
}

switch (choice) {
case 1:
addMovie();
break;
case 2:
showAllMovies();
break;
case 3:
findMovieById();
break;
case 4:
deleteMovieById();
break;
case 5:
System.out.println("退出系统,感谢使用!");
return;
default:
System.out.println("输入有误,请输入1-5的数字!");
}
}
}

// 1. 上架电影(修复换行符问题 + 自增ID)
private void addMovie() {
System.out.println("\\n— 上架电影 —");
System.out.print("请输入电影名称:");
String name = sc.nextLine();

// 处理价格输入的异常
double price;
while (true) {
System.out.print("请输入电影优惠价格:");
try {
price = sc.nextDouble();
sc.nextLine(); // 关键:处理nextDouble后的换行符
break;
} catch (Exception e) {
System.out.println("请输入有效的数字(如:39.9)!");
sc.nextLine(); // 清空错误输入
}
}

System.out.print("请输入电影其他信息:");
String info = sc.nextLine();

// 创建电影对象(使用自增ID,避免重复)
Movie movie = new Movie(nextId++, name, price, info);
movieList.add(movie);
System.out.println("电影【" + name + "】上架成功!ID:" + (nextId – 1));
}

// 2. 查询全部电影
private void showAllMovies() {
System.out.println("\\n— 全部电影列表 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,请先上架电影!");
return;
}
for (Movie movie : movieList) {
System.out.println(movie);
}
}

// 3. 根据ID查询指定电影(补充输出逻辑 + 异常处理)
private void findMovieById() {
System.out.println("\\n— 根据ID查询电影 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,请先上架电影!");
return;
}

// 处理非数字ID输入
int id;
while (true) {
System.out.print("请输入要查询的ID:");
try {
id = sc.nextInt();
sc.nextLine();
break;
} catch (Exception e) {
System.out.println("请输入有效的数字ID!");
sc.nextLine();
}
}

// 遍历集合,查找匹配ID的电影
Movie targetMovie = null;
for (Movie movie : movieList) {
if (movie.getId() == id) {
targetMovie = movie;
break;
}
}

// 输出结果
if (targetMovie != null) {
System.out.println("查询到的电影信息:");
System.out.println(targetMovie);
} else {
System.out.println("未找到ID为【" + id + "】的电影!");
}
}

// 4. 根据ID删除指定电影(补充空集合判断 + 异常处理)
private void deleteMovieById() {
System.out.println("\\n— 根据ID删除电影 —");
if (movieList.isEmpty()) {
System.out.println("暂无电影,无需删除!");
return;
}

// 处理非数字ID输入
int id;
while (true) {
System.out.print("请输入要删除的ID:");
try {
id = sc.nextInt();
sc.nextLine();
break;
} catch (Exception e) {
System.out.println("请输入有效的数字ID!");
sc.nextLine();
}
}

// 遍历删除
for (int i = 0; i < movieList.size(); i++) {
Movie movie = movieList.get(i);
if (movie.getId() == id) {
movieList.remove(i);
System.out.println("ID为【" + id + "】的电影删除成功!");
return;
}
}
System.out.println("未找到ID为【" + id + "】的电影!");
}
}

代码三:电影测试类

package com.sy.movie;

/**
* 电影测试类
*/
public class MovieTest {
public static void main(String[] args) {
MovieManage movieManage = new MovieManage();
movieManage.showMenu();
}
}

三、核心总结

该电影管理系统是面向新手的入门级 CRUD(创建、读取、更新、删除)实战项目,核心解题思路和实现要点可总结为以下 3 点:

  • 架构设计:面向对象 + 分层实现

    • 用Movie实体类封装电影的 ID、名称、价格、信息等核心属性,通过 Getter/Setter 和toString()实现数据的封装与便捷展示;
    • 用ArrayList作为动态容器存储电影对象,搭配自增nextId保证 ID 唯一性,解决删除后 ID 重复的问题;
    • 分 “交互层(菜单)- 业务层(功能方法)- 数据层(实体 + 集合)” 实现,职责清晰、低耦合。
  • 功能实现:核心操作 + 边界处理

    • 核心功能:上架(接收输入→创建对象→存入集合)、全量查询(遍历集合打印)、ID 精准查询(遍历匹配→输出结果)、ID 删除(索引遍历→移除元素);
    • 边界处理:所有功能先判断集合是否为空,输入环节增加非数字校验(try-catch),解决nextDouble()后的换行符陷阱,避免程序崩溃或功能异常。
  • 体验优化:健壮性 + 易用性兼顾

    • 健壮性:对用户非法输入(如字母代替数字)、空集合操作等场景做兜底处理,防止程序异常终止;
    • 易用性:菜单式循环交互、明确的操作反馈(如 “上架成功”“未找到该 ID”)、自动生成 ID,降低用户操作成本。
  • 赞(0)
    未经允许不得转载:171主机测评 » 电影管理系统案例
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址