19、Java——吃货联盟订餐系统(对象+集合)

简介: 19、Java——吃货联盟订餐系统(对象+集合)

⛳️项目需求

   (1)现今已经进入网络时代,人们的日常生活已经离不开网络,如网上购物、看新闻、交友等。

   (2)“只要点点手指,就能送餐上门”,网上订餐越来越受到都市年轻人的青睐。

   (3)现要求开发一个网上订餐系统,需要实现我要订餐、查看餐袋、签收订单、删除订单、我要点赞和退出系统6个功能。


⛳️项目环境准备

   (1)开发工具:MyEclipse,JDK1.7。

   (2)开发语言:Java。


⛳️案例覆盖的技能点

   (1)理解程序基本概念——程序、变量、数据类型。

   (2)会使用顺序、选择、循环、跳转语句编写程序。

   (3)会使用集合。

   (4)了解类、对象、方法、私有变量等相关知识。


⛳️难点分析


  ❤️1、 使用集合保存订单信息

       (1)根据本项目的需求分析可知,每条订单的信息都包括订餐人姓名、选择菜品及份数、送餐时间、送餐地址、订单状态、总金额,并且会有多条订单信息,可以定义一个Order类,在Order类中将订单的各个信息设置为私有属性,再添加这些属性的有参构造方法以及Get/Set方法。


private String name;
  private String dishMeg;
  private int time;
  private String address;
  private int state;
  private double sumPrices;
  public Order() {
  super();
  }
  public Order(String name, String dishMeg, int time, String address,
    int state, double sumPrices) {
  super();
  this.name = name;
  this.dishMeg = dishMeg;
  this.time = time;
  this.address = address;
  this.state = state;
  this.sumPrices = sumPrices;
  }
    //添加私有变量的Get/Set方法

       (2)定义一个两个集合


                       

// 初始化Order集合
                                ArrayList orders=new ArrayList();
                               // 初始化Food集合
                                ArrayList foods = new ArrayList();

 

       (3)初始化数据,并存入两个集合中;


 

// 初始化两条订单Order信息,并存入集合中
  Order od1= new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0);
  Order od2= new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0);
  orders.add(od1);
  orders.add(od2);
  // 供选择的菜品信息
  Food fd1 = new Food("红烧带鱼", 38.0, 0);
  Food fd2 = new Food("鱼香肉丝", 20.0, 0);
  Food fd3 = new Food("时令鲜蔬", 10.0, 0);
  foods.add(fd1);
  foods.add(fd2);
  foods.add(fd3);


   ❤️2、访问订单信息

       访问 ArrayList集合中第i+1条订单信息可采用如下方式

       订餐人姓名:orders.get(i).getName()

       所选菜品信息:orders.get(i).getDishMeg()

       送餐时间:orders.get(i).getTime()

       送餐地址:orders.get(i).getAddress()

       订单状态:orders.get(i).getState()

       订单的总金额:orders.get(i).getSumPrices()


   ❤️3、 删除订单信息

       直接用orders.remove(i);


   ❤️4、 计算订单的总金额

         // 总金额 =菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。



// (6)总金额 = 菜品单价*份数+送餐费。
    // 其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
    double caiPrices = foods.get(caiNum - 1).getPrice() * fenNum;
    if (caiPrices < 50) {
       caiPrices = caiPrices + 5;
       // orders[i].setSumPrices(caiPrices);
    }

⛳️项目实现思路


  ❤️1、 数据初始化

(1)创建订单类:Order类

       订单属性信息有(加private封装):订餐人姓名(name)、选择菜品信息(dishMeg)、送餐时间(time)、送餐地址(address)、订单状态(state)、总金额(sumPrices)。


(2)创建菜品类:Food类

       订单属性信息有(加private封装):菜品名称(disName)、菜品单价(price)、点赞数(praiseNum)。


(3)创建方法类:OrderMethod类

     

// 我要订餐
                OrderMethod.myOrder(orders, foods);
                // 查看餐袋
                OrderMethod.lookOrder(orders);
                // 签收订单
                OrderMethod.signOrder(orders);
                // 删除订单
                OrderMethod.delOrder(orders);
                // 我要点赞
                OrderMethod.myLike(orders, foods);


(4)创建测试类:OrderSystem

   ❤️2、 实现菜单切换

       执行程序,输出系统主菜单。用户根据显示的主菜单,输入功能编号实现菜单的显示和菜单的切换,具体要求如下:

           (1)当输入1~5时,输出相关的菜单项信息。

           (2)显示“输入0返回”。输入0,则返回主菜单,否则,退出系统,终止程序的运行,输出提示信息“谢谢使用,欢迎下次光临!”。


   ❤️3、 实现查看餐袋

       遍历系统中已有的订单,并逐条显示输出,内容包括序号、订餐人姓名、订餐信息(菜品名和份数)、送餐时间、送餐地址、总金额、订单状态(已预订或已完成)。


   ❤️4、 实现我要订餐

       为用户显示系统中提供的菜品信息,获得订餐人信息,形成订单。每条订单包含如下信息。

           (1)订餐人姓名:要求用户输入。

           (2)选择菜品及份数:显示3个供选择菜品的序号、名称、单价、点赞数,提示用户输入要选择的菜品序号及份数。

           (3)送餐时间:当天10:00~20:00间整点送餐,要求用户输入10~20的整数,输入错误,重新输入。

           (4)送餐地址:要求用户输入。

           (5)状态:订单的当前状态。订单有两种状态,0为已预订状态(默认状态),1为已完成(订单已签收)。

           (6)总金额:订单总金额。总金额 = 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。

       各数组中相同下标的数据组成一条订单信息,因此向每个数组相同下标的位置各增加一条数据并保存。


   ❤️5、 实现签收订单

       送餐完成后,要将用户签收订单的状态由“已预订”修改为“已完成”。业务要求如下:

           (1)如果订单的当前状态为:“已预订”且数组下标为用户输入的订单序号减1,就签收。

           (2)如果订单的当前状态为:“已完成”且数组下标为用户输入的订单序号减1,不可签收。

           控制台接收要签收的订单序号。利用for循环结构遍历全部订单,利用if选择结构判断names数组中订餐人姓名是否为null,订单状态是否为已预订且数组下标是指定订单序号减1。

           如果条件成立,该订单的状态值修改为1(即已完成)。


   ❤️6、 实现删除订单

   ❤️7、 实现我要点赞

       选择执行“我要点赞”菜单项。

           (1)界面显示菜品序号、菜品名、单价、点赞数(如为0可不显示),提示用户输入要点赞的菜品序号。

           (2)接收要点赞的菜品序号。

           (3)praiseNums中对应菜品的点赞数加1。

         


⛳️代码展示


   ❤️1、订单信息:

Order类(全部代码)

package cn.bdqn.demo01;
//定义一个订单类
public class Order {
  //定义订单类属性
  private String name;
  private String dishMeg;
  private int time;
  private String address;
  private int state;
  private double sumPrices;
  //定义订单类无参构造
  public Order() {
  super();
  }
  //定义订单类有参构造
  public Order(String name, String dishMeg, int time, String address,
    int state, double sumPrices) {
  super();
  this.name = name;
  this.dishMeg = dishMeg;
  this.time = time;
  this.address = address;
  this.state = state;
  this.sumPrices = sumPrices;
  }
  //定义订单类get/set方法
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  public String getDishMeg() {
  return dishMeg;
  }
  public void setDishMeg(String dishMeg) {
  this.dishMeg = dishMeg;
  }
  public int getTime() {
  return time;
  }
  public void setTime(int time) {
  this.time = time;
  }
  public String getAddress() {
  return address;
  }
  public void setAddress(String address) {
  this.address = address;
  }
  public int getState() {
  return state;
  }
  public void setState(int state) {
  this.state = state;
  }
  public double getSumPrices() {
  return sumPrices;
  }
  public void setSumPrices(double sumPrices) {
  this.sumPrices = sumPrices;
  }
}


   ❤️2、菜品:Food类

       逻辑部分参照吃货联盟订餐系统的逻辑改写即可


package cn.bdqn.demo01;
import java.util.Scanner;
//定义菜品类
public class Food {
  static Scanner input = new Scanner(System.in);
  //定义菜品类属性
  private String disName;
  private double price;
  private int praiseNum;
  //定义菜品类无参构造
  public Food() {
  super();
  }
  //定义菜品类有参构造
  public Food(String disName, double price, int praiseNum) {
  super();
  this.disName = disName;
  this.price = price;
  this.praiseNum = praiseNum;
  }
  //定义菜品类get/set方法
  public String getDisName() {
  return disName;
  }
  public void setDisName(String disName) {
  this.disName = disName;
  }
  public double getPrice() {
  return price;
  }
  public void setPrice(double price) {
  this.price = price;
  }
  public int getPraiseNum() {
  return praiseNum;
  }
  public void setPraiseNum(int praiseNum) {
  this.praiseNum = praiseNum;
  }
}



   ❤️3、操作方法:OrderMethod类

package cn.bdqn.demo01;
import java.util.ArrayList;
import java.util.Scanner;
public class OrderMethod {
  static Scanner input = new Scanner(System.in);
  // 定义一个欢迎菜单方法
  public static void showOrder() {
  // 输出欢迎菜单
  System.out.println("欢迎使用吃货联盟订餐系统");
  System.out.println("-------------------------");
  System.out.println("1.我要订餐");
  System.out.println("2.查看餐带");
  System.out.println("3.签收订单");
  System.out.println("4.删除订单");
  System.out.println("5.我要点赞");
  System.out.println("6.退出系统");
  System.out.println("-------------------------");
  }
  // 定义一个“我要订餐”的方法
  public static void myOrder(ArrayList orders, ArrayList foods) {
  for (int i = 0; i < orders.size(); i++) {
    System.out.println("--新增订单--");
    // (1)订餐人姓名
    System.out.println("请输入订餐人姓名:");
    String orderName = input.next();
    // orders[i].setName(orderName);
    // (2)选择菜品及份数
    System.out.println("序号\t名称\t\t单价\t点赞数");
    for (int j = 0; j < foods.size(); j++) {
    System.out.println((j + 1) + "\t" + foods.get(j).getDisName()
      + "\t\t" + foods.get(j).getPrice() + "\t"
      + foods.get(j).getPraiseNum());
    }
    System.out.println("请选择菜品序号:");
    int caiNum = input.nextInt();
    System.out.println("选择份数:");
    int fenNum = input.nextInt();
    String dishFen = foods.get(caiNum - 1).getDisName() + " " + fenNum
      + "份";
    // (3)送餐时间
    System.out.println("请选择送餐时间(10:00-20:00整点送餐):");
    int orderTime = input.nextInt();
    while (orderTime < 10 || orderTime > 20) {
    System.out.println("输入错误,请重新输入:");
    orderTime = input.nextInt();
    // orders[i].setTime(input.nextInt());
    }
    // (4)送餐地址
    System.out.println("请输入送餐地址:");
    String orderAddress = input.next();
    // orders[i].setAddress(input.next());
    // (5)状态(新增时,订单状态均为默认状态0)
    // orders[i].setState(0);
    // (6)总金额 =
    // 菜品单价*份数+送餐费。其中,当单笔订单金额达到50元时,免收送餐费;否则,需交纳5元送餐费。
    double caiPrices = foods.get(caiNum - 1).getPrice() * fenNum;
    if (caiPrices < 50) {
    caiPrices = caiPrices + 5;
    // orders[i].setSumPrices(caiPrices);
    }
    // 将订餐数据添加到order数组中
    Order od = new Order(orderName, dishFen, orderTime, orderAddress,
      0, caiPrices);
    orders.add(od);
    break;
  }
  }
  // 定义一个“查看餐袋”的方法
  public static void lookOrder(ArrayList orders) {
  System.out.println("--查看餐袋--");
  System.out
    .println("序号\t\t订餐人\t\t餐品信息\t\t\t送餐时间\t\t送餐地址\t\t\t总金额\t\t订单状态");
  for (int i = 0; i < orders.size(); i++) {
    if (orders.get(i) != null) {
    String time = orders.get(i).getTime() + "点";
    String sumPrice = orders.get(i).getSumPrices() + "元";
    String state;
    if (orders.get(i).getState() == 0) {
      state = "已预订";
    } else {
      state = "已完成";
    }
    System.out.println((i + 1) + "\t\t" + orders.get(i).getName()
      + "\t\t" + orders.get(i).getDishMeg() + "\t\t" + time
      + "\t\t" + orders.get(i).getAddress() + "\t\t" + sumPrice
      + "\t\t" + state);
    }
  }
  }
  // 定义一个“签收订单”的方法
  public static void signOrder(ArrayList orders) {
  System.out.println("--签收订单--");
  System.out.println("请选择需要签收的订单序号:");
  int orderNum = input.nextInt();
  for (int i = 0; i < orders.size(); i++) {
    if (orderNum == i + 1) {
    if (orders.get(i) != null) {
      if (orders.get(i).getState() == 0) {
      orders.get(i).setState(1);
      System.out.println("订单签收完成!");
      } else {
      System.out.println("你选择的订单已完成,不能再次签收订单!");
      }
    }
    }
  }
  }
  // 定义一个“删除订单”的方法
  public static void delOrder(ArrayList orders) {
  System.out.println("--删除订单--");
  System.out.println("请选择需要删除的订单序号:");
  int orderNum1 = input.nextInt();
  for (int i = 0; i < orders.size(); i++) {
    if (orderNum1 == i + 1) {
    if (orders.get(i)!= null) {
      if (orders.get(i).getState() == 0) {
      System.out.println("该订单仍在预定状态,不能删除!");
      break;
      } else {
      orders.remove(i);
      System.out.println("订单删除成功!");
      }
    }
    }
  }
  }
  // 定义一个“我要点赞”的方法
  public static void myLike(ArrayList orders, ArrayList foods) {
  System.out.println("--我要点赞--");
  System.out.println("序号\t名称\t\t单价\t点赞数");
  for (int j = 0; j < foods.size(); j++) {
    System.out.println((j + 1) + "\t" + foods.get(j).getDisName() + "\t\t"
      + foods.get(j).getPrice() + "\t" + foods.get(j).getPraiseNum());
  }
  System.out.println("请选择点赞的菜品序号:");
  int caiZanNum = input.nextInt();
  for (int j = 0; j < foods.size(); j++) {
    if (caiZanNum == j + 1) {
    foods.get(j).setPraiseNum(foods.get(j).getPraiseNum() + 1);
    }
  }
  System.out.println("点赞后的菜品展示:");
  System.out.println("序号\t名称\t\t单价\t点赞数");
  for (int j = 0; j < foods.size(); j++) {
    System.out.println((j + 1) + "\t" + foods.get(j).getDisName() + "\t\t"
      + foods.get(j).getPrice() + "\t" + foods.get(j).getPraiseNum());
  }
  }
}

❤️4、订餐系统:OrderSystem类

package cn.bdqn.demo01;
import java.util.ArrayList;
import java.util.Scanner;
public class OrderSystem {
  public static void main(String[] args) {
  Scanner input = new Scanner(System.in);
  // 初始化Order集合
  ArrayList orders=new ArrayList();
  // 初始化Food集合
  ArrayList foods = new ArrayList();
  // 初始化两条订单Order信息,并存入集合中
  Order od1= new Order("张三", "红烧带鱼 2份", 12, "天成路207号", 1, 76.0);
  Order od2= new Order("李四", "鱼香肉丝 2份", 12, "天成路207号", 0, 45.0);
  orders.add(od1);
  orders.add(od2);
  // 供选择的菜品信息
  Food fd1 = new Food("红烧带鱼", 38.0, 0);
  Food fd2 = new Food("鱼香肉丝", 20.0, 0);
  Food fd3 = new Food("时令鲜蔬", 10.0, 0);
  foods.add(fd1);
  foods.add(fd2);
  foods.add(fd3);
  // 默认初始值
  boolean flag = true;
  // 循环初始值
  int num = -1;
  do {
    //欢迎菜单
    OrderMethod.showOrder();
    System.out.println("请选择:");
    int choose = input.nextInt();
    switch (choose) {
    case 1:
    // 我要订餐
    OrderMethod.myOrder(orders, foods);
    break;
    case 2:
    // 查看餐袋
    OrderMethod.lookOrder(orders);
    break;
    case 3:
    // 签收订单
    OrderMethod.signOrder(orders);
    break;
    case 4:
    // 删除订单
    OrderMethod.delOrder(orders);
    break;
    case 5:
    // 我要点赞
    OrderMethod.myLike(orders, foods);
    break;
    case 6:
    // 退出系统
    flag = false;
    break;
    default:
    flag = false;
    break;
    }
    if (flag) {
    System.out.println("输入0返回:");
    num = input.nextInt();
    } else {
    break;
    }
  } while (num == 0);
  System.out.println("谢谢使用,欢迎下次光临");
  }
}



相关文章
|
15天前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
4天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
11 2
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
9天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
9天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
9天前
|
Java 开发者
|
18天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
8天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
10 0
|
13天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
22 0
|
18天前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
15 0