package com.business;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;
import com.dao.MenuXmlDAO;
import com.persistence.MenuPO;
import com.view.UserFrame;
public class UserMenuXmlBO {
private double totalPrice = 0;
/**
* 显示可选择的随机菜单
*
* @param userFrame
* 用户窗口
*
*/
public String getChoice(UserFrame userFrame) {
totalPrice = 0;
String choices = "";
// 获得所有选择
choices = generateChoice(Integer.valueOf(userFrame.getNumberInput().getText()), userFrame);
// 将所有选择显示在输出框中
return choices + "\n";
}
/**
* 根据人数产生选择
*
* @param number
* 人数
* @param userFrame
* 用户窗口
* @return 返回一份菜谱
*/
private String generateChoice(int number, UserFrame userFrame) {
// dishNumber[0]、dishNumber[1]、dishNumber[2]、dishNumber[3]分别存放汤、荤菜、素菜、
// 其他菜的份数
int[] dishNumber = null;
// 结果串
String choice = "";
// 根据人数产生菜谱的分配
dishNumber = generateMenus(dishNumber, number);
// 到XML文档中取出所有的菜单,存放在容器menuMap中
MenuXmlDAO menuDao = new MenuXmlDAO();
Map<Integer, MenuPO> menuMap = menuDao.getAllMenu("src/com/dao/menu.xml");
// 开始查找合适的菜谱
choice = startSearching(menuMap, userFrame, dishNumber);
return choice;
}
/**
*
* @param menuMap
* 装所有菜的容器
* @param userFrame
* 用户窗口
* @param dishNumber
* 菜谱的分配
* @return 返回一份菜谱
*/
private String startSearching(Map<Integer, MenuPO> menuMap, UserFrame userFrame, int[] dishNumber) {
// 查找是否有合适菜谱的次数
int searchTimes = 0;
String choice = "";
// 总价格和总预算的差值控制在-10到+10之间
while (Double.valueOf(userFrame.getNumberInput().getText())
* Double.valueOf(userFrame.getPriceInput().getText()) - 10 >= totalPrice
|| Double.valueOf(userFrame.getNumberInput().getText())
* Double.valueOf(userFrame.getPriceInput().getText()) + 10 <= totalPrice) {
totalPrice = 0;
choice = "";
searchTimes++;
// 获得一份菜谱,该份菜谱中所有类型的菜都是不一样的
choice = getAllDiffernet(choice, menuMap, dishNumber);
if (Double.valueOf(userFrame.getNumberInput().getText())
* Double.valueOf(userFrame.getPriceInput().getText()) - 10 < totalPrice
&& Double.valueOf(userFrame.getNumberInput().getText())
* Double.valueOf(userFrame.getPriceInput().getText()) + 10 > totalPrice) {
return choice + "\t\t总价格:" + totalPrice + "元";
}
if (searchTimes == 100) {// 找100次还未找到合适的菜谱,则返回不合适的菜谱供用户选择
return "未能为你找到接近总预算的菜谱!\n以下是我们为你另行建议的菜谱:\n" + choice + "\t\t总价格:" + totalPrice + "元";
}
}
return "";
}
/**
*
* @param choice
* 菜谱的初始值
* @param menuMap
* 装所有菜的容器
* @param dishNumber
* 菜谱的分配
* @return 返回已经生成好的菜谱
*/
private String getAllDiffernet(String choice, Map<Integer, MenuPO> menuMap, int[] dishNumber) {
// 获得dishNumber[0]份不同的汤
choice += getDifferent(menuMap, dishNumber[0], 1);
// 获得dishNumber[1]份不同的荤菜
choice += getDifferent(menuMap, dishNumber[1], 2);
// 获得dishNumber[2]份不同的素菜
choice += getDifferent(menuMap, dishNumber[2], 3);
// 获得dishNumber[3]份不同的其他菜
choice += getDifferent(menuMap, dishNumber[3], 4);
return choice;
}
/**
* 获得各道菜的最大数
*
* @param menuMap
* 装所有菜的容器
* @param type
* 菜的类型
* @return 返回某道菜的最大值
*/
private int max(Map<Integer, MenuPO> menuMap, int type) {
// 获得最大汤数
int maxSoup = getMaxSoup(menuMap);
// 获得最大荤菜数
int maxMeat = getMaxMeat(menuMap);
// 获得最大素菜数
int maxVegetable = getMaxVegetable(menuMap);
// 获得最大其他菜数
int maxOther = getMaxOther(menuMap);
switch (type) {
case 1:
return maxSoup;
case 2:
return maxMeat;
case 3:
return maxVegetable;
case 4:
return maxOther;
default:
break;
}
return 0;
}
/**
* 获得其他菜的最大数
*
* @param menuMap
* 装所有菜的容器
* @return 返回其他菜的最大数
*/
private int getMaxOther(Map<Integer, MenuPO> menuMap) {
int maxOther = 0;
Iterator iterator = menuMap.keySet().iterator();
// 遍历每道菜
while (iterator.hasNext()) {
int key = (Integer) iterator.next();
if (key / 1000 == 4) {
maxOther++;
}
}
return maxOther;
}
/**
* 获得素菜的最大数
*
* @param menuMap
* 装所有菜的容器
* @return 返回素菜的最大数
*/
private int getMaxVegetable(Map<Integer, MenuPO> menuMap) {
int maxVegetable = 0;
Iterator iterator = menuMap.keySet().iterator();
// 遍历每道菜
while (iterator.hasNext()) {
int key = (Integer) iterator.next();
if (key / 1000 == 3) {
maxVegetable++;
}
}
return maxVegetable;
}
/**
* 获得荤菜的最大数
*
* @param menuMap
* 装所有菜的容器
* @return 返回荤菜的最大数
*/
private int getMaxMeat(Map<Integer, MenuPO> menuMap) {
int maxMeat = 0;
Iterator iterator = menuMap.keySet().iterator();
// 遍历每道菜
while (iterator.hasNext()) {
int key = (Integer) iterator.next();
if (key / 1000 == 2) {
maxMeat++;
}
}
return maxMeat;
}
/**
* 获得汤的最大数
*
* @param menuMap
* 装所有菜的容器
* @return 返回汤的最大数
*/
private int getMaxSoup(Map<Integer, MenuPO> menuMap) {
int maxSoup = 0;
Iterator iterator = menuMap.keySet().iterator();
// 遍历每道菜
while (iterator.hasNext()) {
int key = (Integer) iterator.next();
if (key / 1000 == 1) {
maxSoup++;
}
}
return maxSoup;
}
/**
* 获得各种不同的菜
*
* @param menuMap
* 装所有菜的容器
* @param number
* 菜的道数
* @param type
* 菜的类型
* @return 返回同一类型的number道不同的菜
*/
private String getDifferent(Map<Integer, MenuPO> menuMap, int number, int type) {
// 确保菜数不会超过现有菜的最大值
number = numberLimit(number, type, menuMap);
// 存放不同菜的容器
List<String> list = new ArrayList<String>();
// 随机生成的菜
String randomDish = "";
// 把所有不同的菜用字符串的形式存在temp中
String temp = "";
// 确定同一类别的菜只有一份
boolean same = true;
while (same) {
if (list.size() == number) {
for (int i = 0; i < list.size(); i++) {
temp += list.get(i);
}
same = false;
} else {
// 获得一份随机菜
randomDish = getRandom(menuMap, type);
if (!list.contains(randomDish)) {
// 获得本随机菜的价格然后累加得到总价格
String[] dishArray = randomDish.split("\t");
totalPrice += Double.valueOf(dishArray[2]);
list.add(randomDish);
}
}
}
return temp;
}
/**
* 订餐时,对某一类型的菜数的限制,最大限制在该类型菜最大值
*
* @param number
* 菜的道数
*
auto_order.rar_JAVA Swing mvc_mvc java swing_swing mvc_swing mvc
版权申诉
55 浏览量
2022-09-20
18:12:23
上传
评论
收藏 308KB RAR 举报
刘良运
- 粉丝: 66
- 资源: 1万+
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈