售票java代码_初探12306售票算法(二)-java代码实践

本文介绍了一个基于Java实现的12306售票算法,包括初始化车厢票据信息、生成站点购票、订票主程序和订单实体的代码实践,通过示例代码详细解释了如何模拟12306的售票过程。
摘要由CSDN通过智能技术生成

周五闲来无事,基于上一篇关于初探12306售票算法(一)-理论,进行了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 < ticketSize; i++) {

int saleChannel = (int) (Math.random() * 10) % 8;

Ticket ticket = new Ticket();

ticket.setSaleChannel(saleChannel);

ticket.setTicketType(ticketType);

ticket.setGuid(UUID.randomUUID().toString());

ticket.setFromDate(train.getFromDate());

ticket.setTicketFlag(CommonUtil.initTicketFlag(train));

ticket.setTrainNo(train.getTrainNo());

result.add(ticket);

}

}

return result;

}

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 < stationNum; j++) {

temp = temp.or(new BigInteger(buidTicket(j)));

}

return temp.shiftRight(1).toString();

}

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.订单实体(保留必要的订单信息)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.train.ticket;2 /**

3 * 订单实体4 *@authorguo_zhifeng5 *6 */

7 public classOrder {8

9 privateString orderId;10 private String ticketGuid;//票据id

11 private String ticketFlag;//订票标记

12 private String seatType;//座位类型

13 private String fromDate;//发车日期

14 private String trainNO;//列车编号

15 private int saleChannel;//销售渠道

16 publicString getOrderId() {17 returnorderId;18 }19 public voidsetOrderId(String orderId) {20 this.orderId =orderId;21 }22 publicString getTicketGuid() {23 returnticketGuid;24 }25 public voidsetTicketGuid(String ticketGuid) {26 this.ticketGuid =ticketGuid;27 }28 publicString getTicketFlag() {29 returnticketFlag;30 }31 public voidsetTicketFlag(String ticketFlag) {32 this.ticketFlag =ticketFlag;33 }34 publicString getSeatType() {35 returnseatType;36 }37 public voidsetSeatType(String seatType) {38 this.seatType =seatType;39 }40 publicString getFromDate() {41 returnfromDate;42 }43 public voidsetFromDate(String fromDate) {44 this.fromDate =fromDate;45 }46 publicString getTrainNO() {47 returntrainNO;48 }49 public voidsetTrainNO(String trainNO) {50 this.trainNO =trainNO;51 }52 public intgetSaleChannel() {53 returnsaleChannel;54 }55 public void setSaleChannel(intsaleChannel) {56 this.saleChannel =saleChannel;57 }58

59

60 }

View Code

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.train.ticket;2 /**

3 * 票务实体4 *@authorguo_zhifeng5 *6 */

7 public classTicket {8 privateString ticketFlag;9 privateString ticketType;10 private intsaleChannel;11 privateString trainNo;12 privateString guid;13 private String fromDate;//发车日期

14

15 publicString getGuid() {16 returnguid;17 }18

19 public voidsetGuid(String guid) {20 this.guid =guid;21 }22

23 publicString getTrainNo() {24 returntrainNo;25 }26

27 public voidsetTrainNo(String trainNo) {28 this.trainNo =trainNo;29 }30

31

32 publicString getTicketFlag() {33 returnticketFlag;34 }35

36 public voidsetTicketFlag(String ticketFlag) {37 this.ticketFlag =ticketFlag;38 }39

40 publicString getTicketType() {41 returnticketType;42 }43

44 public voidsetTicketType(String ticketType) {45 this.ticketType =ticketType;46 }47

48 public intgetSaleChannel() {49 returnsaleChannel;50 }51

52 public void setSaleChannel(intsaleChannel) {53 this.saleChannel =saleChannel;54 }55

56 publicString getFromDate() {57 returnfromDate;58 }59

60 public voidsetFromDate(String fromDate) {61 this.fromDate =fromDate;62 }63

64 }

View Code

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.train.ticket;2

3 importjava.util.Map;4 /**

5 * 某一趟的列车的信息6 *@authorguo_zhifeng7 *8 */

9 public classTrain {10 private String trainNo;//火车编号

11 private int stationNum;//车站数量

12 private Map seatTotalNum;//各种座位的数量

13 privateString fromDate;14

15

16 publicString getFromDate() {17 returnfromDate;18 }19

20 public voidsetFromDate(String fromDate) {21 this.fromDate =fromDate;22 }23

24 publicString getTrainNo() {25 returntrainNo;26 }27

28 public voidsetTrainNo(String trainNo) {29 this.trainNo =trainNo;30 }31

32 public intgetStationNum() {33 returnstationNum;34 }35

36 public void setStationNum(intstationNum) {37 this.stationNum =stationNum;38 }39

40 public MapgetSeatTotalNum() {41 returnseatTotalNum;42 }43

44 public void setSeatTotalNum(MapseatTotalNum) {45 this.seatTotalNum =seatTotalNum;46 }47

48 }

View Code

5.主程序

5.1初始化一列车厢

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

5.3输出耗时时间

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagecom.train.main;2

3 importjava.io.File;4 importjava.math.BigDecimal;5 importjava.math.BigInteger;6 importjava.util.ArrayList;7 importjava.util.HashMap;8 importjava.util.List;9 importjava.util.Map;10

11 importcom.train.ticket.Order;12 importcom.train.ticket.Ticket;13 importcom.train.ticket.Train;14 importcom.train.util.CommonUtil;15

16 public classMainTest {17

18 public static voidmain(String[] args) {19 Train train = newTrain();20 train.setTrainNo("0909123SA873878");21 train.setFromDate("2016/06/11");22 train.setStationNum(18);23 Map seatMap = new HashMap();24 seatMap.put("商务座", 500);25 seatMap.put("一等座", 1000);26 seatMap.put("二等座", 2000);27 train.setSeatTotalNum(seatMap);28 //生成票据

29 System.out.println("初始化列车中的票");30 List ticketList =CommonUtil.initTicketList(train);31 String fileName = "D:\\RESULT.txt";32 File f = newFile(fileName);33 if(f.exists()) f.delete();34 long startTime =System.currentTimeMillis();35 //int i = 0;36 //for (Ticket ticket : ticketList) {37 //CommonUtil.appendMethodA(fileName,38 //i + "||" + CommonUtil.toJSON(ticket) + "\n", true);39 //i++;40 //}

41 System.out.println("开始订票");42 long beginTime =System.currentTimeMillis();43 List orderResult = new ArrayList();44

45 for (int j = 0; j < train.getStationNum() - 1; j++) {46 String ticketStr =CommonUtil.buidTicket(j);47 //String ticketStr = CommonUtil.buidTicket(1,train.getStationNum());;48 //System.exit(0);

49

50 List tempListOrder =CommonUtil.createOrderList(ticketStr,51 ticketList, train);52 orderResult.addAll(tempListOrder);53

54 }55 long endTime =System.currentTimeMillis();56 System.out.println("订票完成");57 //int m = 0;58

59 //for (Ticket ticket : ticketList) {60 //String temp = m + "||" + CommonUtil.toJSON(ticket) + ",";61 // //System.out.println(temp);62 //CommonUtil.appendMethodA(fileName, temp, true);63 //m++;64 //}65 //int k = 1;66 //for (Order order : orderResult) {67 //String temp = order.getOrderId()68 //+ "||" + order.getSaleChannel()69 //+ "||" + order.getFromDate()70 //+ "||" + order.getSeatType()71 //+ "||" + order.getTicketGuid()72 //+ "||" + order.getTrainNO()73 //+ "||" + order.getTicketFlag()74 //+ "||" + new BigInteger(order.getTicketFlag()).toString(2)75 //+ "||" +k;76 //CommonUtil.appendMethodA(fileName,temp, true);77 //k++;78 //}

79

80 long eedTime =System.currentTimeMillis();81 System.out.println("生成订单" + orderResult.size() + "||耗时时间:"

82 + (endTime - beginTime) + "毫秒");83 System.out.println("每秒钟生成单据数(逐张订票)"+ new BigDecimal(orderResult.size()).multiply(new BigDecimal(1000)).divide(new BigDecimal(endTime - beginTime),0,BigDecimal.ROUND_HALF_DOWN));84

85 System.out.println("执行完毕");86

87 }88

89 }

View Code

6.运行结果

82cd2b4fd3a154fcd6b164b1d3b92dde.png

完整代码: 源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值