热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Java代码实践12306售票算法(二)

这篇文章主要介绍了Java代码实践12306售票算法(二)的相关资料,需要的朋友可以参考下

周五闲来无事,基于上一篇关于浅析12306售票算法(java版)理论,进行了java编码实践供各位读者参考(以下为相关代码的简单描述)

1.订票工具类

1.1初始化一列车厢的票据信息

/**
* 生成Ticket信息
*
* @param train
* @return
*/
public static List initTicketList(Train train) {
List result = new ArrayList();
Map seatMap = train.getSeatTotalNum();
for (Entry entry : seatMap.entrySet()) {
int ticketSize = entry.getValue();
String ticketType = entry.getKey();
for (int i = 0; i 

1.2 生成站点购票(比如说第进行移位即可如第1站1,第二站‘10' 这里返回的十进制的)

/**
* 创建
* @param i
* @param stationNum
* @return
*/
public static String buidTicket(int i, int stationNum) {
BigInteger temp = new BigInteger("0");
for (int j = i; j 

1.3 订票主程序,这里一次只定一张票(A=A|B)

/**
* 根据筛选条件取得对应的车次
* @param ticketStr
* @param ticketList
* @param condition
* @return
*/
public static Order createOrderByCondition(String ticketStr,List ticketList,Map condition){
Order tempOrder = null;
for (Ticket ticket : ticketList) {
BigInteger toTicket = new BigInteger(ticketStr);
BigInteger fromTicket = new BigInteger(ticket.getTicketFlag());
// 如果可以订票,那么久进行扣除库存&&
// (ticket.getSaleChannel()==(ticket.getSaleChannel()|1))
if (canTicket(fromTicket, toTicket)
&&ticket.getTicketType().equals(condition.get("ticketType").toString())
//&&(ticket.getSaleChannel()==(ticket.getSaleChannel()|2))
) {
tempOrder = new Order();
tempOrder.setOrderId(UUID.randomUUID().toString());
tempOrder.setSeatType(ticket.getTicketType());
tempOrder.setTicketFlag(toTicket.toString());
tempOrder.setTrainNO(ticket.getTrainNo());
tempOrder.setFromDate(ticket.getFromDate());
tempOrder.setSaleChannel(ticket.getSaleChannel());
tempOrder.setTicketGuid(ticket.getGuid());
ticket.setTicketFlag(fromTicket.or(toTicket).toString());
break;
}
}
return tempOrder;
}

1.4 判断是否邮票,A=~(~A|B)

/**
* 订票判断是否可以订票
*
* @param fromTicket
* @param toTicket
* @return
*/
private static boolean canTicket(BigInteger fromTicket, BigInteger toTicket) {
return fromTicket.equals(fromTicket.not().or(toTicket).not());
}

2.订单实体(保留必要的订单信息)

package com.train.ticket;
/**
* 订单实体
* @author guo_zhifeng
*
*/
public class Order {

private String orderId;
private String ticketGuid;//票据id
private String ticketFlag;//订票标记
private String seatType;//座位类型
private String fromDate;//发车日期
private String trainNO;//列车编号
private int saleChannel;//销售渠道
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getTicketGuid() {
return ticketGuid;
}
public void setTicketGuid(String ticketGuid) {
this.ticketGuid = ticketGuid;
}
public String getTicketFlag() {
return ticketFlag;
}
public void setTicketFlag(String ticketFlag) {
this.ticketFlag = ticketFlag;
}
public String getSeatType() {
return seatType;
}
public void setSeatType(String seatType) {
this.seatType = seatType;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public String getTrainNO() {
return trainNO;
}
public void setTrainNO(String trainNO) {
this.trainNO = trainNO;
}
public int getSaleChannel() {
return saleChannel;
}
public void setSaleChannel(int saleChannel) {
this.saleChannel = saleChannel;
}
}

3.票务实体(保留必要的票务信息)

package com.train.ticket;
/**
* 票务实体
* @author guo_zhifeng
*
*/
public class Ticket {
private String ticketFlag;
private String ticketType;
private int saleChannel;
private String trainNo;
private String guid;
private String fromDate;//发车日期
public String getGuid() {
return guid;
}
public void setGuid(String guid) {
this.guid = guid;
}
public String getTrainNo() {
return trainNo;
}
public void setTrainNo(String trainNo) {
this.trainNo = trainNo;
}
public String getTicketFlag() {
return ticketFlag;
}
public void setTicketFlag(String ticketFlag) {
this.ticketFlag = ticketFlag;
}
public String getTicketType() {
return ticketType;
}
public void setTicketType(String ticketType) {
this.ticketType = ticketType;
}
public int getSaleChannel() {
return saleChannel;
}
public void setSaleChannel(int saleChannel) {
this.saleChannel = saleChannel;
}
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
}

4.列车初始化信息(只进行主要信息)

package com.train.ticket;
import java.util.Map;
/**
* 某一趟的列车的信息
* @author guo_zhifeng
*
*/
public class Train {
private String trainNo;// 火车编号
private int stationNum;// 车站数量
private Map seatTotalNum;// 各种座位的数量
private String fromDate;
public String getFromDate() {
return fromDate;
}
public void setFromDate(String fromDate) {
this.fromDate = fromDate;
}
public String getTrainNo() {
return trainNo;
}
public void setTrainNo(String trainNo) {
this.trainNo = trainNo;
}
public int getStationNum() {
return stationNum;
}
public void setStationNum(int stationNum) {
this.statiOnNum= stationNum;
}
public Map getSeatTotalNum() {
return seatTotalNum;
}
public void setSeatTotalNum(Map seatTotalNum) {
this.seatTotalNum = seatTotalNum;
}
}

5.主程序

5.1初始化一列车厢

5.2按照逐站购票的形式,最大化 即 AB BC CD DE EF等等

5.3输出耗时时间

package com.train.main;
import java.io.File;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.train.ticket.Order;
import com.train.ticket.Ticket;
import com.train.ticket.Train;
import com.train.util.CommonUtil;
public class MainTest {
public static void main(String[] args) {
Train train = new Train();
train.setTrainNo("SA");
train.setFromDate("//");
train.setStationNum();
Map seatMap = new HashMap();
seatMap.put("商务座", );
seatMap.put("一等座", );
seatMap.put("二等座", );
train.setSeatTotalNum(seatMap);
// 生成票据
System.out.println("初始化列车中的票");
List ticketList = CommonUtil.initTicketList(train);
String fileName = "D:\\RESULT.txt";
File f = new File(fileName);
if(f.exists()) f.delete();
long startTime = System.currentTimeMillis();
//int i = ;
//for (Ticket ticket : ticketList) {
// CommonUtil.appendMethodA(fileName,
// i + "||" + CommonUtil.toJSON(ticket) + "\n", true);
// i++;
//}
System.out.println("开始订票");
long beginTime = System.currentTimeMillis();
List orderResult = new ArrayList();
for (int j = ; j  tempListOrder = CommonUtil.createOrderList(ticketStr,
ticketList, train);
orderResult.addAll(tempListOrder);
}
long endTime = System.currentTimeMillis();
System.out.println("订票完成");
//int m = ;

// for (Ticket ticket : ticketList) {
// String temp = m + "||" + CommonUtil.toJSON(ticket) + ",";
// // System.out.println(temp);
// CommonUtil.appendMethodA(fileName, temp, true);
// m++;
// }
// int k = ;
// for (Order order : orderResult) {
// String temp = order.getOrderId() 
// + "||" + order.getSaleChannel() 
// + "||" + order.getFromDate() 
// + "||" + order.getSeatType() 
// + "||" + order.getTicketGuid()
// + "||" + order.getTrainNO() 
// + "||" + order.getTicketFlag()
// + "||" + new BigInteger(order.getTicketFlag()).toString()
// + "||" +k;
// CommonUtil.appendMethodA(fileName,temp, true);
// k++;
// }

long eedTime = System.currentTimeMillis();
System.out.println("生成订单" + orderResult.size() + "||耗时时间:"
+ (endTime - beginTime) + "毫秒");
System.out.println("每秒钟生成单据数(逐张订票)"+ new BigDecimal(orderResult.size()).multiply(new BigDecimal()).divide(new BigDecimal(endTime - beginTime),,BigDecimal.ROUND_HALF_DOWN));
System.out.println("执行完毕");
}
}

6.运行结果

以上所述是小编给大家介绍的Java代码实践12306售票算法(二),希望对大家有所帮助!


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
author-avatar
pacer猫处
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有