售票java代码_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 < 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.订单实体(保留必要的订单信息)

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 < train.getStationNum() - ; j++) {

String ticketStr = CommonUtil.buidTicket(j);

//String ticketStr = CommonUtil.buidTicket(,train.getStationNum());;

//System.exit();

List 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.运行结果

78e868b273183ff817c3cb5e0311c919.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值